Skip to content

Commit 16a5826

Browse files
committed
dict has no __missing__method, it is called only if declared by derived class
1 parent 4461774 commit 16a5826

File tree

3 files changed

+49
-14
lines changed

3 files changed

+49
-14
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictBuiltins.java

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ITER__;
3939
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REVERSED__;
4040
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LEN__;
41-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__MISSING__;
4241
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETITEM__;
4342
import static com.oracle.graal.python.runtime.exception.PythonErrorType.KeyError;
4443
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
@@ -67,13 +66,15 @@
6766
import com.oracle.graal.python.builtins.objects.function.PKeyword;
6867
import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
6968
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
69+
import com.oracle.graal.python.builtins.objects.method.PMethod;
7070
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
7171
import com.oracle.graal.python.builtins.objects.str.PString;
7272
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
7373
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
7474
import com.oracle.graal.python.nodes.ErrorMessages;
75-
import com.oracle.graal.python.nodes.PGuards;
7675
import com.oracle.graal.python.nodes.PRaiseNode;
76+
import com.oracle.graal.python.nodes.SpecialMethodNames;
77+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__MISSING__;
7778
import com.oracle.graal.python.nodes.builtins.ListNodes;
7879
import com.oracle.graal.python.nodes.call.CallNode;
7980
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
@@ -96,9 +97,11 @@
9697
import com.oracle.truffle.api.dsl.Cached.Exclusive;
9798
import com.oracle.truffle.api.dsl.Fallback;
9899
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
100+
import com.oracle.truffle.api.dsl.ImportStatic;
99101
import com.oracle.truffle.api.dsl.Specialization;
100102
import com.oracle.truffle.api.frame.VirtualFrame;
101103
import com.oracle.truffle.api.library.CachedLibrary;
104+
import com.oracle.truffle.api.nodes.Node;
102105
import com.oracle.truffle.api.profiles.BranchProfile;
103106
import com.oracle.truffle.api.profiles.ConditionProfile;
104107

@@ -274,18 +277,41 @@ public abstract static class GetItemNode extends PythonBinaryBuiltinNode {
274277
Object getItem(VirtualFrame frame, PDict self, Object key,
275278
@CachedLibrary(value = "self.getDictStorage()") HashingStorageLibrary hlib,
276279
@Exclusive @Cached("createBinaryProfile()") ConditionProfile profile,
277-
@Cached("create(__MISSING__)") LookupAndCallBinaryNode specialNode) {
280+
@Cached DispatchMissingNode missing) {
278281
final Object result = hlib.getItemWithFrame(self.getDictStorage(), key, profile, frame);
279282
if (result == null) {
280-
return specialNode.executeObject(frame, self, key);
283+
return missing.execute(frame, self, key);
281284
}
282285
return result;
283286
}
284287
}
285288

286-
@Builtin(name = __MISSING__, minNumOfPositionalArgs = 2)
287-
@GenerateNodeFactory
288-
public abstract static class MissingNode extends PythonBinaryBuiltinNode {
289+
@ImportStatic(SpecialMethodNames.class)
290+
protected abstract static class DispatchMissingNode extends Node {
291+
292+
protected abstract Object execute(VirtualFrame frame, Object self, Object key);
293+
294+
@Specialization(guards = "hasMissing(self, lib)", limit = "1")
295+
protected Object misssing(Object self, Object key,
296+
@CachedLibrary("self") PythonObjectLibrary lib,
297+
@Exclusive @Cached CallNode callNode) {
298+
return callNode.execute(lib.lookupAttribute(self, __MISSING__), key);
299+
}
300+
301+
@Specialization(guards = "!hasMissing(self, lib)", limit = "1")
302+
protected Object misssing(VirtualFrame frame, Object self, Object key,
303+
@SuppressWarnings("unused") @CachedLibrary("self") PythonObjectLibrary lib,
304+
@Exclusive @Cached DefaultMissingNode missing) {
305+
return missing.execute(frame, self, key);
306+
}
307+
308+
protected boolean hasMissing(Object self, PythonObjectLibrary lib) {
309+
Object missing = lib.lookupAttribute(self, __MISSING__);
310+
return missing != PNone.NO_VALUE && missing instanceof PMethod;
311+
}
312+
}
313+
314+
protected abstract static class DefaultMissingNode extends PythonBinaryBuiltinNode {
289315
@SuppressWarnings("unused")
290316
@Specialization
291317
Object run(Object self, PString key,
@@ -301,13 +327,8 @@ Object run(Object self, String key) {
301327

302328
@SuppressWarnings("unused")
303329
@Specialization(guards = "!isString(key)")
304-
Object run(VirtualFrame frame, Object self, Object key,
305-
@Cached("create(__REPR__)") LookupAndCallUnaryNode specialNode) {
306-
Object name = specialNode.executeObject(frame, key);
307-
if (!PGuards.isString(name)) {
308-
throw raise(TypeError, ErrorMessages.RETURNED_NON_STRING, "__repr__", name);
309-
}
310-
throw raise(KeyError, "%s", name);
330+
Object run(VirtualFrame frame, Object self, Object key) {
331+
throw raise(KeyError, new Object[]{key});
311332
}
312333
}
313334

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRaiseNode.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ public final PException raise(PythonBuiltinClassType type, String format, Object
7070
throw execute(type, PNone.NO_VALUE, format, arguments);
7171
}
7272

73+
public final PException raise(PythonBuiltinClassType type, Object... arguments) {
74+
throw execute(type, PNone.NO_VALUE, PNone.NO_VALUE, arguments);
75+
}
76+
7377
public final PException raise(PythonBuiltinClassType type, Exception e) {
7478
throw execute(type, PNone.NO_VALUE, getMessage(e), new Object[0]);
7579
}
@@ -158,6 +162,12 @@ PException doPythonManagedClass(PythonManagedClass exceptionType, @SuppressWarni
158162
throw raise(factory.createBaseException(exceptionType));
159163
}
160164

165+
@Specialization(guards = {"isNoValue(cause)", "isNoValue(format)", "arguments.length > 0"})
166+
PException doBuiltinType(PythonBuiltinClassType type, @SuppressWarnings("unused") PNone cause, @SuppressWarnings("unused") PNone format, Object[] arguments,
167+
@Shared("factory") @Cached PythonObjectFactory factory) {
168+
throw raise(factory.createBaseException(type, factory.createTuple(arguments)));
169+
}
170+
161171
@Specialization(guards = {"isNoValue(cause)"})
162172
PException doBuiltinType(PythonBuiltinClassType type, @SuppressWarnings("unused") PNone cause, String format, Object[] arguments,
163173
@Shared("factory") @Cached PythonObjectFactory factory) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/PythonBuiltinBaseNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ public final PException raise(PythonBuiltinClassType type, String format, Object
173173
return getRaiseNode().raise(type, format, arguments);
174174
}
175175

176+
public final PException raise(PythonBuiltinClassType type, Object... arguments) {
177+
return getRaiseNode().raise(type, arguments);
178+
}
179+
176180
public final PException raise(PythonBuiltinClassType type, Exception e) {
177181
return getRaiseNode().raise(type, e);
178182
}

0 commit comments

Comments
 (0)