8000 Properly order traits in GetForeignObjectClassNode · oracle/graalpython@195d4bb · GitHub
[go: up one dir, main page]

Skip to content

Commit 195d4bb

Browse files
eregonansalond
authored andcommitted
Properly order traits in GetForeignObjectClassNode
(cherry picked from commit 8922dc6)
1 parent 98d9629 commit 195d4bb

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def t(obj):
150150
# ForeignInstantiable
151151
self.assertEqual(t((e for e in [1])), polyglot.ForeignIteratorIterable)
152152
self.assertEqual(t(iter([1])), polyglot.ForeignIteratorIterable)
153-
self.assertEqual(t(object), polyglot.ForeignExecutableClass)
153+
self.assertEqual(t(object), polyglot.ForeignClassExecutable)
154154
self.assertEqual(t(None), polyglot.ForeignNone)
155155
self.assertEqual(t(1), polyglot.ForeignNumber)
156156
self.assertEqual(t("abc"), polyglot.ForeignString)
@@ -472,9 +472,9 @@ def test_java_import_from_jar(self):
472472

473473
def test_java_class(self):
474474
from java.lang import Integer, Number, NumberFormatException
475-
self.assertEqual(type(Integer).mro(), [polyglot.ForeignClass, polyglot.ForeignInstantiable, polyglot.ForeignAbstractClass, polyglot.ForeignObject, object])
475+
self.assertEqual(type(Integer).mro(), [polyglot.ForeignClass, polyglot.ForeignAbstractClass, polyglot.ForeignInstantiable, polyglot.ForeignObject, object])
476476
self.assertEqual(type(Number).mro(), [polyglot.ForeignAbstractClass, polyglot.ForeignObject, object])
477-
self.assertEqual(type(NumberFormatException).mro(), [polyglot.ForeignClass, polyglot.ForeignInstantiable, polyglot.ForeignAbstractClass, polyglot.ForeignObject, object])
477+
self.assertEqual(type(NumberFormatException).mro(), [polyglot.ForeignClass, polyglot.ForeignAbstractClass, polyglot.ForeignInstantiable, polyglot.ForeignObject, object])
478478

479479
def test_java_exceptions(self):
480480
# TODO: more tests

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetForeignObjectClassNode.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -87,21 +87,26 @@ public enum Trait {
8787
// The type field is only set for cases which are already implemented.
8888

8989
// First in MRO
90+
// Interop types first as they are the most concrete/specific types
91+
NULL("None", PythonBuiltinClassType.PNone),
9092
BOOLEAN("Boolean", PythonBuiltinClassType.ForeignBoolean),
9193
NUMBER("Number", PythonBuiltinClassType.ForeignNumber), // int, float, complex
9294
STRING("String", PythonBuiltinClassType.PString),
95+
EXCEPTION("Exception", PythonBuiltinClassType.PBaseException),
96+
META_OBJECT("AbstractClass"), // PythonBuiltinClassType.PythonClass ?
97+
98+
// Interop traits
99+
EXECUTABLE("Executable"),
100+
INSTANTIABLE("Instantiable"),
101+
102+
// Container traits/types must be last, see comment above
93103
// Hash before Array so that foreign dict+list prefers dict.[]
94104
HASH("Dict", PythonBuiltinClassType.PDict),
95105
// Array before Iterable so that foreign list+iterable prefers list.__iter__
96106
ARRAY("List", PythonBuiltinClassType.PList),
97-
EXCEPTION("Exception", PythonBuiltinClassType.PBaseException),
98-
EXECUTABLE("Executable"),
99-
INSTANTIABLE("Instantiable"),
100107
// Iterator before Iterable so that foreign iterator+iterable prefers iterator.__iter__
101108
ITERATOR("Iterator", PythonBuiltinClassType.PIterator),
102-
ITERABLE("Iterable"),
103-
META_OBJECT("AbstractClass"), // PythonBuiltinClassType.PythonClass ?
104-
NULL("None", PythonBuiltinClassType.PNone);
109+
ITERABLE("Iterable");
105110
// Last in MRO
106111

107112
public static final Trait[] VALUES = Trait.values();
@@ -217,14 +222,14 @@ private PythonManagedClass resolvePolyglotForeignClass(int traits) {
217222
traitsList.add(classForTraits(trait.bit));
218223
}
219224

220-
if (trait == Trait.INSTANTIABLE && Trait.META_OBJECT.isSet(traits)) {
221-
// Deal with it when we are at trait META_OBJECT
222-
} else if (trait == Trait.META_OBJECT) {
225+
if (trait == Trait.META_OBJECT) {
223226
if (Trait.INSTANTIABLE.isSet(traits)) {
224227
nameBuilder.append("Class");
225228
} else {
226229
nameBuilder.append("AbstractClass");
227230
}
231+
} else if (trait == Trait.INSTANTIABLE && Trait.META_OBJECT.isSet(traits)) {
232+
// Dealt with above
228233
} else {
229234
nameBuilder.append(trait.name);
230235
}

0 commit comments

Comments
 (0)
0