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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy