Skip to content

Commit 6f9c200

Browse files
msimacektimfel
authored andcommitted
Fix error handling in str.format_map
1 parent d99ec91 commit 6f9c200

File tree

2 files changed

+20
-26
lines changed

2 files changed

+20
-26
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,17 @@
5757
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins;
5858
import com.oracle.graal.python.builtins.objects.dict.PDict;
5959
import com.oracle.graal.python.builtins.objects.ints.PInt;
60+
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
6061
import com.oracle.graal.python.lib.PyNumberIndexNode;
62+
import com.oracle.graal.python.nodes.ErrorMessages;
6163
import com.oracle.graal.python.nodes.SpecialMethodNames;
62-
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
64+
import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
6365
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
66+
import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode;
6467
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6568
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
6669
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
70+
import com.oracle.graal.python.nodes.object.GetClassNode;
6771
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
6872
import com.oracle.graal.python.nodes.util.CannotCastException;
6973
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
@@ -73,6 +77,7 @@
7377
import com.oracle.truffle.api.dsl.Cached;
7478
import com.oracle.truffle.api.dsl.Fallback;
7579
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
80+
import com.oracle.truffle.api.dsl.ImportStatic;
7681
import com.oracle.truffle.api.dsl.NodeFactory;
7782
import com.oracle.truffle.api.dsl.Specialization;
7883
import com.oracle.truffle.api.dsl.TypeSystemReference;
@@ -152,8 +157,8 @@ public boolean doObject(VirtualFrame frame, Object value) {
152157
}
153158

154159
@Builtin(name = "getitem", minNumOfPositionalArgs = 2)
155-
@TypeSystemReference(PythonArithmeticTypes.class)
156160
@GenerateNodeFactory
161+
@ImportStatic(SpecialMethodSlot.class)
157162
public abstract static class GetItemNode extends PythonBinaryBuiltinNode {
158163

159164
@Specialization
@@ -162,17 +167,23 @@ public static Object doDict(VirtualFrame frame, PDict dict, Object item,
162167
return getItem.execute(frame, dict, item);
163168
}
164169

165-
@Specialization
170+
@Specialization(guards = "!isPString(value)")
166171
public static Object doSequence(VirtualFrame frame, PSequence value, Object index,
167172
@Cached SequenceNodes.GetSequenceStorageNode getStorage,
168173
@Cached SequenceStorageNodes.GetItemNode getItemNode) {
169174
return getItemNode.execute(frame, getStorage.execute(value), index);
170175
}
171176

172177
@Specialization
173-
public static Object doObject(VirtualFrame frame, Object value, Object index,
174-
@Cached("create(__GETITEM__)") LookupAndCallBinaryNode getItemNode) {
175-
return getItemNode.executeObject(frame, value, index);
178+
public Object doObject(VirtualFrame frame, Object value, Object index,
179+
@Cached GetClassNode getClassNode,
180+
@Cached(parameters = "GetItem") LookupSpecialMethodSlotNode lookupGetItem,
181+
@Cached CallBinaryMethodNode callGetItem) {
182+
Object method = lookupGetItem.execute(frame, getClassNode.execute(value), value);
183+
if (method == PNone.NO_VALUE) {
184+
throw raise(TypeError, ErrorMessages.OBJ_NOT_SUBSCRIPTABLE, value);
185+
}
186+
return callGetItem.executeObject(frame, method, value, index);
176187
}
177188
}
178189

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
import static com.oracle.graal.python.nodes.BuiltinNames.FORMAT;
3030
import static com.oracle.graal.python.nodes.BuiltinNames.FORMAT_MAP;
3131
import static com.oracle.graal.python.nodes.ErrorMessages.ENCODER_RETURNED_P_INSTEAD_OF_BYTES;
32-
import static com.oracle.graal.python.nodes.ErrorMessages.OBJ_NOT_SUBSCRIPTABLE;
33-
import static com.oracle.graal.python.nodes.ErrorMessages.TAKES_EXACTLY_S_ARGUMENTS_D_GIVEN;
3432
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ADD__;
3533
import static com.oracle.graal.python.nodes.SpecialMethodNames.__CONTAINS__;
3634
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
@@ -107,7 +105,6 @@
107105
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
108106
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins;
109107
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
110-
import com.oracle.graal.python.lib.PyMappingCheckNode;
111108
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
112109
import com.oracle.graal.python.lib.PyObjectHashNode;
113110
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -260,7 +257,7 @@ String format(VirtualFrame frame, String self, Object[] args, PKeyword[] kwargs,
260257
}
261258
}
262259

263-
@Builtin(name = FORMAT_MAP, minNumOfPositionalArgs = 1, declaresExplicitSelf = true, parameterNames = {"self", "mapping"})
260+
@Builtin(name = FORMAT_MAP, minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"self", "mapping"})
264261
@ArgumentClinic(name = "self", conversion = ArgumentClinic.ClinicConversion.String)
265262
@GenerateNodeFactory
266263
@ImportStatic(SpecialMethodNames.class)
@@ -270,11 +267,10 @@ protected ArgumentClinicProvider getArgumentClinic() {
270267
return StringBuiltinsClinicProviders.FormatMapNodeClinicProviderGen.INSTANCE;
271268
}
272269

273-
@Specialization(guards = "checkMapping.execute(mapping)", limit = "1")
270+
@Specialization
274271
String format(VirtualFrame frame, String self, Object mapping,
275272
@Cached BuiltinFunctions.FormatNode format,
276-
@Cached OperatorModuleBuiltins.GetItemNode getItem,
277-
@SuppressWarnings("unused") @Cached PyMappingCheckNode checkMapping) {
273+
@Cached OperatorModuleBuiltins.GetItemNode getItem) {
278274

279275
TemplateFormatter template = new TemplateFormatter(self);
280276

@@ -287,19 +283,6 @@ String format(VirtualFrame frame, String self, Object mapping,
287283
IndirectCallContext.exit(frame, language, context, state);
288284
}
289285
}
290-
291-
@SuppressWarnings("unused")
292-
@Specialization(guards = {"!checkMapping.execute(obj)", "!isNone(obj)"}, limit = "1")
293-
String format(String self, Object obj,
294-
@SuppressWarnings("unused") @Cached PyMappingCheckNode checkMapping) {
295-
throw raise(TypeError, OBJ_NOT_SUBSCRIPTABLE, obj);
296-
}
297-
298-
@SuppressWarnings("unused")
299-
@Specialization(guards = "isNone(obj)")
300-
String format(String self, PNone obj) {
301-
throw raise(TypeError, TAKES_EXACTLY_S_ARGUMENTS_D_GIVEN, "format_map", "one", 0);
302-
}
303286
}
304287

305288
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1)

0 commit comments

Comments
 (0)