Skip to content

Commit 4d64538

Browse files
committed
[GR-29785] JavaClass should print better string then <foreign object at xxxxx>
1 parent 4531cf4 commit 4d64538

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,3 +531,17 @@ def test_foreign_slice_setting():
531531
assert True
532532
else:
533533
assert False, "should throw a type error again"
534+
535+
def test_foreign_repl():
536+
from java.util.logging import LogRecord
537+
from java.util.logging import Level
538+
539+
lr = LogRecord(Level.ALL, "message")
540+
assert repr(LogRecord).startswith('<JavaClass[java.util.logging.LogRecord] at')
541+
assert repr(lr).startswith('<JavaObject[java.util.logging.LogRecord] at')
542+
543+
from java.lang import Integer
544+
i = Integer('22')
545+
assert repr(Integer).startswith('<JavaClass[java.lang.Integer] at')
546+
assert repr(i) == '22'
547+

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import com.oracle.graal.python.builtins.PythonBuiltins;
7373
import com.oracle.graal.python.builtins.objects.PNone;
7474
import com.oracle.graal.python.builtins.objects.PNotImplemented;
75+
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
7576
import com.oracle.graal.python.builtins.objects.function.PKeyword;
7677
import com.oracle.graal.python.builtins.objects.ints.PInt;
7778
import com.oracle.graal.python.builtins.objects.iterator.PForeignArrayIterator;
@@ -98,6 +99,7 @@
9899
import com.oracle.graal.python.runtime.PythonContext;
99100
import com.oracle.graal.python.runtime.exception.PythonErrorType;
100101
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
102+
import com.oracle.graal.python.util.PythonUtils;
101103
import com.oracle.truffle.api.CompilerDirectives;
102104
import com.oracle.truffle.api.dsl.Cached;
103105
import com.oracle.truffle.api.dsl.CachedContext;
@@ -840,6 +842,35 @@ protected Object doArray(VirtualFrame frame, Object object,
840842
return doIt(frame, object);
841843
}
842844

845+
@Specialization(guards = "getContext().getEnv().isHostObject(self)")
846+
Object doHostObject(VirtualFrame frame, Object self,
847+
@CachedLibrary(limit = "3") InteropLibrary lib) {
848+
try {
849+
boolean isMetaObject = lib.isMetaObject(self);
850+
Object metaObject = isMetaObject
851+
? self
852+
: lib.hasMetaObject(self) ? lib.getMetaObject(self) : null;
853+
if (metaObject != null) {
854+
Object displayName = lib.toDisplayString(metaObject);
855+
String text = createDisplayName(isMetaObject, displayName);
856+
return PythonUtils.format("<%s at 0x%x>", text, PythonAbstractObject.systemHashCode(self));
857+
}
858+
859+
} catch (UnsupportedMessageException ex) {
860+
// do nothing
861+
}
862+
return doIt(frame, self);
863+
}
864+
865+
@CompilerDirectives.TruffleBoundary
866+
private static String createDisplayName(boolean isMetaObject, Object object) {
867+
StringBuilder sb = new StringBuilder();
868+
sb.append(isMetaObject ? "JavaClass[" : "JavaObject[");
869+
sb.append(object.toString());
870+
sb.append("]");
871+
return sb.toString();
872+
}
873+
843874
@Fallback
844875
protected Object doIt(VirtualFrame frame, Object object) {
845876
return getObjectStrNode().call(frame, object);

0 commit comments

Comments
 (0)