Skip to content

Commit 4e46916

Browse files
committed
Fix setitem call and error handling
1 parent 4533eea commit 4e46916

File tree

2 files changed

+34
-32
lines changed

2 files changed

+34
-32
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mappingproxy/MappingproxyBuiltins.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@
3333
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
3434
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ITER__;
3535
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LEN__;
36-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETITEM__;
3736
import static com.oracle.graal.python.runtime.exception.PythonErrorType.KeyError;
38-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
3937

4038
import java.util.List;
4139

@@ -51,11 +49,9 @@
5149
import com.oracle.graal.python.builtins.objects.dict.PDict;
5250
import com.oracle.graal.python.builtins.objects.dict.PDictView;
5351
import com.oracle.graal.python.builtins.objects.function.PArguments;
54-
import com.oracle.graal.python.nodes.ErrorMessages;
5552
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5653
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5754
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
58-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
5955
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6056
import com.oracle.truffle.api.dsl.Cached;
6157
import com.oracle.truffle.api.dsl.Fallback;
@@ -168,16 +164,6 @@ Object getItem(VirtualFrame frame, PMappingproxy self, Object key,
168164
}
169165
}
170166

171-
@Builtin(name = __SETITEM__, minNumOfPositionalArgs = 3)
172-
@GenerateNodeFactory
173-
public abstract static class SetItemNode extends PythonTernaryBuiltinNode {
174-
@Specialization
175-
@SuppressWarnings("unused")
176-
Object run(PMappingproxy self, Object key, Object value) {
177-
throw raise(TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, "mappingproxy");
178-
}
179-
}
180-
181167
@Builtin(name = __CONTAINS__, minNumOfPositionalArgs = 2)
182168
@GenerateNodeFactory
183169
public abstract static class ContainsNode extends PythonBuiltinNode {
@@ -241,5 +227,4 @@ PNotImplemented doGeneric(Object self, Object other) {
241227
return PNotImplemented.NOT_IMPLEMENTED;
242228
}
243229
}
244-
245230
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/subscript/SetItemNode.java

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,18 @@
2626
package com.oracle.graal.python.nodes.subscript;
2727

2828
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETITEM__;
29+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
2930

30-
import com.oracle.graal.python.builtins.objects.object.PythonObject;
31-
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins.GetattributeNode;
31+
import com.oracle.graal.python.builtins.objects.PNone;
32+
import com.oracle.graal.python.nodes.ErrorMessages;
33+
import com.oracle.graal.python.nodes.PRaiseNode;
3234
import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode;
35+
import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode;
3336
import com.oracle.graal.python.nodes.expression.ExpressionNode;
3437
import com.oracle.graal.python.nodes.frame.WriteNode;
3538
import com.oracle.graal.python.nodes.object.GetClassNode;
3639
import com.oracle.graal.python.nodes.statement.StatementNode;
40+
import com.oracle.truffle.api.CompilerDirectives;
3741
import com.oracle.truffle.api.dsl.Cached;
3842
import com.oracle.truffle.api.dsl.NodeChild;
3943
import com.oracle.truffle.api.dsl.Specialization;
@@ -45,6 +49,7 @@
4549
@NodeChild(value = "slice", type = ExpressionNode.class)
4650
@NodeChild(value = "right", type = ExpressionNode.class)
4751
public abstract class SetItemNode extends StatementNode implements WriteNode {
52+
@Child private PRaiseNode raiseNode;
4853

4954
public abstract ExpressionNode getPrimary();
5055

@@ -105,22 +110,34 @@ public void executeWith(VirtualFrame frame, Object value) {
105110
public abstract void executeWith(VirtualFrame frame, Object primary, Object slice, Object value);
106111

107112
@Specialization
108-
void doSpecialObject(VirtualFrame frame, PythonObject primary, int index, Object value,
109-
@Cached("create()") GetattributeNode getSetitemNode,
110-
@Cached("create()") GetClassNode getClassNode,
111-
@Cached("create()") CallTernaryMethodNode callNode) {
112-
Object primaryClass = getClassNode.execute(primary);
113-
Object setItemMethod = getSetitemNode.execute(frame, primaryClass, __SETITEM__);
114-
callNode.execute(frame, setItemMethod, primary, index, value);
113+
void doIntIndex(VirtualFrame frame, Object primary, int index, Object value,
114+
@Cached GetClassNode getClassNode,
115+
@Cached("create(__SETITEM__)") LookupSpecialMethodNode lookupSetitem,
116+
@Cached CallTernaryMethodNode callSetitem) {
117+
Object setitem = lookupSetitem.execute(frame, getClassNode.execute(primary), primary);
118+
if (setitem == PNone.NO_VALUE) {
119+
getRaiseNode().raise(TypeError, ErrorMessages.P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, primary);
120+
}
121+
callSetitem.execute(frame, setitem, primary, index, value);
115122
}
116123

117-
@Specialization
118-
void doSpecialObject1(VirtualFrame frame, Object primary, Object index, Object value,
119-
@Cached("create()") GetattributeNode getSetitemNode,
120-
@Cached("create()") GetClassNode getClassNode,
121-
@Cached("create()") CallTernaryMethodNode callNode) {
122-
Object primaryClass = getClassNode.execute(primary);
123-
Object setItemMethod = getSetitemNode.execute(frame, primaryClass, __SETITEM__);
124-
callNode.execute(frame, setItemMethod, primary, index, value);
124+
@Specialization(replaces = "doIntIndex")
125+
void doGeneric(VirtualFrame frame, Object primary, Object index, Object value,
126+
@Cached GetClassNode getClassNode,
127+
@Cached("create(__SETITEM__)") LookupSpecialMethodNode lookupSetitem,
128+
@Cached CallTernaryMethodNode callSetitem) {
129+
Object setitem = lookupSetitem.execute(frame, getClassNode.execute(primary), primary);
130+
if (setitem == PNone.NO_VALUE) {
131+
getRaiseNode().raise(TypeError, ErrorMessages.P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, primary);
132+
}
133+
callSetitem.execute(frame, setitem, primary, index, value);
134+
}
135+
136+
private PRaiseNode getRaiseNode() {
137+
if (raiseNode == null) {
138+
CompilerDirectives.transferToInterpreterAndInvalidate();
139+
raiseNode = insert(PRaiseNode.create());
140+
}
141+
return raiseNode;
125142
}
126143
}

0 commit comments

Comments
 (0)