Skip to content

Commit cb58013

Browse files
committed
Remove redundant methods in ForeignObjectBuiltins
1 parent 0d1fd42 commit cb58013

File tree

4 files changed

+12
-158
lines changed

4 files changed

+12
-158
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_interop.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,15 @@ def test_java_iterator(self):
10011001
with self.assertRaisesRegex(TypeError, "descriptor requires a 'iterator' object but received a 'ForeignIterator'"):
10021002
itr.__setstate__(0)
10031003

1004+
def test_java_iterable(self):
1005+
from java.util import LinkedHashSet
1006+
s = LinkedHashSet() # not hasArrayElements() and not hasHashEntries()
1007+
s.add(1)
1008+
s.add(2)
1009+
assert 2 in s
1010+
assert 2 in s
1011+
assert 3 not in s
1012+
10041013
def test_java_map_as_keywords(self):
10051014
from java.util import HashMap, LinkedHashMap
10061015

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/AccessForeignItemNodes.java

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,10 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.foreign;
4242

43-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
44-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.KeyError;
4543
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4644
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
4745

4846
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
49-
import com.oracle.graal.python.builtins.objects.PNone;
50-
import com.oracle.graal.python.builtins.objects.foreign.AccessForeignItemNodesFactory.RemoveForeignItemNodeGen;
5147
import com.oracle.graal.python.builtins.objects.str.StringBuiltins;
5248
import com.oracle.graal.python.nodes.ErrorMessages;
5349
import com.oracle.graal.python.nodes.PNodeWithContext;
@@ -64,7 +60,6 @@
6460
import com.oracle.truffle.api.dsl.TypeSystemReference;
6561
import com.oracle.truffle.api.frame.VirtualFrame;
6662
import com.oracle.truffle.api.interop.InteropLibrary;
67-
import com.oracle.truffle.api.interop.UnknownKeyException;
6863
import com.oracle.truffle.api.interop.UnsupportedMessageException;
6964
import com.oracle.truffle.api.library.CachedLibrary;
7065
import com.oracle.truffle.api.strings.TruffleString;
@@ -113,48 +108,4 @@ Object doFail(Object object, Object key) {
113108
throw raise(TypeError, ErrorMessages.OBJ_NOT_SUBSCRIPTABLE, object);
114109
}
115110
}
116-
117-
protected abstract static class RemoveForeignItemNode extends AccessForeignItemBaseNode {
118-
119-
public abstract Object execute(VirtualFrame frame, Object object, Object idx);
120-
121-
@Specialization(guards = {"lib.hasHashEntries(object)"})
122-
Object doHashKey(Object object, Object key,
123-
@CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib,
124-
@Cached TruffleString.SwitchEncodingNode switchEncodingNode,
125-
@Cached GilNode gil) {
126-
if (lib.isHashEntryRemovable(object, key)) {
127-
gil.release(true);
128-
try {
129-
lib.removeHashEntry(object, key);
130-
return PNone.NONE;
131-
} catch (UnknownKeyException e) {
132-
throw CompilerDirectives.shouldNotReachHere(e);
133-
} catch (UnsupportedMessageException e) {
134-
return raise(AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_REMOVABLE, key, object);
135-
} finally {
136-
gil.acquire();
137-
}
138-
}
139-
throw keyError(this, key, lib, switchEncodingNode);
140-
}
141-
142-
@Fallback
143-
@SuppressWarnings("unused")
144-
Object doFail(Object object, Object key) {
145-
throw raise(TypeError, ErrorMessages.OBJ_DOESNT_SUPPORT_DELETION, object);
146-
}
147-
148-
public static RemoveForeignItemNode create() {
149-
return RemoveForeignItemNodeGen.create();
150-
}
151-
}
152-
153-
private static PException keyError(AccessForeignItemBaseNode node, Object key, InteropLibrary lib, TruffleString.SwitchEncodingNode switchEncodingNode) {
154-
try {
155-
return node.raise(KeyError, switchEncodingNode.execute(lib.asTruffleString(lib.toDisplayString(key, true)), TS_ENCODING));
156-
} catch (UnsupportedMessageException e) {
157-
throw CompilerDirectives.shouldNotReachHere(e);
158-
}
159-
}
160111
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignObjectBuiltins.java

Lines changed: 1 addition & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,12 @@
2727
package com.oracle.graal.python.builtins.objects.foreign;
2828

2929
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError;
30-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError;
3130
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
3231
import static com.oracle.graal.python.builtins.objects.str.StringUtils.simpleTruffleStringFormatUncached;
3332
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___BASES__;
3433
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___BASES__;
3534
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__;
3635
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
37-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__;
38-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__;
3936
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIR__;
4037
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__;
4138
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
@@ -63,7 +60,6 @@
6360
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__;
6461
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__;
6562
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INSTANCECHECK__;
66-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__;
6763
import static com.oracle.graal.python.nodes.StringLiterals.T_NONE;
6864
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
6965

@@ -84,19 +80,15 @@
8480
import com.oracle.graal.python.builtins.objects.ints.PInt;
8581
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
8682
import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
87-
import com.oracle.graal.python.builtins.objects.str.StringBuiltins;
8883
import com.oracle.graal.python.builtins.objects.type.TpSlots;
8984
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode;
9085
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
9186
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode;
9287
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode;
93-
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode;
9488
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.SetAttrBuiltinNode;
9589
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode;
9690
import com.oracle.graal.python.lib.PyNumberAddNode;
97-
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
9891
import com.oracle.graal.python.lib.PyNumberMultiplyNode;
99-
import com.oracle.graal.python.lib.PyObjectRichCompareBool;
10092
import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode;
10193
import com.oracle.graal.python.nodes.ErrorMessages;
10294
import com.oracle.graal.python.nodes.PGuards;
@@ -145,7 +137,6 @@
145137
import com.oracle.truffle.api.frame.VirtualFrame;
146138
import com.oracle.truffle.api.interop.ArityException;
147139
import com.oracle.truffle.api.interop.InteropLibrary;
148-
import com.oracle.truffle.api.interop.StopIterationException;
149140
import com.oracle.truffle.api.interop.UnknownIdentifierException;
150141
import com.oracle.truffle.api.interop.UnsupportedMessageException;
151142
import com.oracle.truffle.api.interop.UnsupportedTypeException;
@@ -205,40 +196,6 @@ static boolean bool(Object receiver,
205196
}
206197
}
207198

208-
@Slot(SlotKind.sq_length)
209-
@Slot(SlotKind.mp_length)
210-
@GenerateUncached
211-
@GenerateNodeFactory
212-
abstract static class LenNode extends LenBuiltinNode {
213-
@Specialization
214-
static int len(Object self,
215-
@Bind("this") Node inliningTarget,
216-
@CachedLibrary(limit = "3") InteropLibrary lib,
217-
@Cached GilNode gil,
218-
@Cached PRaiseNode.Lazy raiseNode) {
219-
gil.release(true);
220-
long result = 0;
221-
boolean hasResult = false;
222-
try {
223-
if (lib.isIterator(self) || lib.hasIterator(self)) {
224-
return 0; // a value signifying it has a length, but it's unknown
225-
} else if (lib.hasHashEntries(self)) {
226-
result = lib.getHashSize(self);
227-
hasResult = true;
228-
}
229-
} catch (UnsupportedMessageException e) {
230-
// fall through
231-
} finally {
232-
gil.acquire();
233-
}
234-
if (hasResult) {
235-
return PyNumberAsSizeNode.doLongExact(inliningTarget, result, OverflowError, raiseNode);
236-
} else {
237-
throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, T___LEN__);
238-
}
239-
}
240-
}
241-
242199
// TODO: remove once all dunder methods are converted to slots and to
243200
// NormalizeForeignForBinopNode
244201
abstract static class ForeignBinaryNode extends BinaryOpBuiltinNode {
@@ -748,52 +705,6 @@ private static int hashCodeBoundary(Object self) {
748705
}
749706
}
750707

751-
@Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2)
752-
@GenerateNodeFactory
753-
abstract static class ContainsNode extends PythonBinaryBuiltinNode {
754-
@Specialization
755-
static Object contains(VirtualFrame frame, Object self, Object arg,
756-
// accesses both self and iterator
757-
@CachedLibrary(limit = "3") InteropLibrary library,
758-
@Bind("this") Node inliningTarget,
759-
@Cached PyObjectRichCompareBool.EqNode eqNode,
760-
@Cached TruffleString.SwitchEncodingNode switchEncodingNode,
761-
@Cached StringBuiltins.ContainsNode containsNode,
762-
@Cached PForeignToPTypeNode convertNode,
763-
@Cached PRaiseNode.Lazy raiseNode) {
764-
try {
765-
if (library.isString(self)) {
766-
TruffleString selfStr = switchEncodingNode.execute(library.asTruffleString(self), TS_ENCODING);
767-
return containsNode.execute(frame, selfStr, arg);
768-
}
769-
Object iterator = null;
770-
if (library.isIterator(self)) {
771-
iterator = self;
772-
} else if (library.hasHashEntries(self)) {
773-
iterator = library.getHashKeysIterator(self);
774-
} else if (library.hasIterator(self)) {
775-
iterator = library.getIterator(self);
776-
}
777-
if (iterator != null) {
778-
try {
779-
while (library.hasIteratorNextElement(iterator)) {
780-
Object next = convertNode.executeConvert(library.getIteratorNextElement(iterator));
781-
if (eqNode.compare(frame, inliningTarget, arg, next)) {
782-
return true;
783-
}
784-
}
785-
} catch (StopIterationException e) {
786-
// fallthrough
787-
}
788-
return false;
789-
}
790-
throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.FOREIGN_OBJ_ISNT_ITERABLE);
791-
} catch (UnsupportedMessageException e) {
792-
throw CompilerDirectives.shouldNotReachHere(e);
793-
}
794-
}
795-
}
796-
797708
@Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
798709
@GenerateNodeFactory
799710
public abstract static class IterNode extends PythonUnaryBuiltinNode {
@@ -808,15 +719,10 @@ static Object doGeneric(Object object,
808719
@Cached GilNode gil) {
809720
gil.release(true);
810721
try {
811-
if (lib.isIterator(object)) {
812-
return convertNode.executeConvert(object);
813-
} else if (lib.hasIterator(object)) {
722+
if (lib.hasIterator(object)) {
814723
return convertNode.executeConvert(lib.getIterator(object));
815724
} else if (lib.isString(object)) {
816725
return factory.createStringIterator(switchEncodingNode.execute(lib.asTruffleString(object), TS_ENCODING));
817-
} else if (lib.hasHashEntries(object)) {
818-
// just like dict.__iter__, we take the keys by default
819-
return convertNode.executeConvert(lib.getHashKeysIterator(object));
820726
}
821727
} catch (UnsupportedMessageException e) {
822728
throw CompilerDirectives.shouldNotReachHere(e);
@@ -1063,18 +969,6 @@ static void doDelete(Object object, Object key, @SuppressWarnings("unused") PNon
1063969
}
1064970
}
1065971

1066-
@Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 2)
1067-
@GenerateNodeFactory
1068-
abstract static class DelitemNode extends PythonBinaryBuiltinNode {
1069-
@Child private AccessForeignItemNodes.RemoveForeignItemNode delForeignItemNode = AccessForeignItemNodes.RemoveForeignItemNode.create();
1070-
1071-
@Specialization
1072-
PNone doit(VirtualFrame frame, Object object, Object key) {
1073-
delForeignItemNode.execute(frame, object, key);
1074-
return PNone.NONE;
1075-
}
1076-
}
1077-
1078972
@Builtin(name = J___DIR__, minNumOfPositionalArgs = 1)
1079973
@GenerateNodeFactory
1080974
abstract static class DirNode extends PythonUnaryBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MethodsFlags.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ public abstract class MethodsFlags {
207207
public static final long SIMPLECDATA_M_FLAGS = NB_BOOL;
208208
public static final long UNIONTYPE_M_FLAGS = SQ_REPEAT | TYPE_M_FLAGS;
209209

210-
public static final long FOREIGNOBJECT_M_FLAGS = NB_BOOL | SQ_LENGTH | MP_LENGTH | NB_MULTIPLY |
210+
public static final long FOREIGNOBJECT_M_FLAGS = NB_BOOL | NB_MULTIPLY |
211211
NB_SUBTRACT | NB_DIVMOD | NB_FLOOR_DIVIDE | NB_TRUE_DIVIDE | NB_AND | NB_XOR | NB_OR | NB_INDEX |
212-
SQ_CONTAINS | MP_SUBSCRIPT;
212+
MP_SUBSCRIPT;
213213

214214
}

0 commit comments

Comments
 (0)