shellsim 0.1.12__tar.gz → 0.1.14__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. {shellsim-0.1.12 → shellsim-0.1.14}/Cargo.lock +1 -1
  2. {shellsim-0.1.12 → shellsim-0.1.14}/Cargo.toml +1 -1
  3. {shellsim-0.1.12 → shellsim-0.1.14}/PKG-INFO +1 -1
  4. {shellsim-0.1.12 → shellsim-0.1.14}/python/native/Cargo.lock +2 -2
  5. {shellsim-0.1.12 → shellsim-0.1.14}/python/native/Cargo.toml +1 -1
  6. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/protocol.rs +63 -0
  7. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/asyncio.py +371 -38
  8. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/calls.rs +14 -0
  9. {shellsim-0.1.12 → shellsim-0.1.14}/LICENSE +0 -0
  10. {shellsim-0.1.12 → shellsim-0.1.14}/README.md +0 -0
  11. {shellsim-0.1.12 → shellsim-0.1.14}/pyproject.toml +0 -0
  12. {shellsim-0.1.12 → shellsim-0.1.14}/python/native/src/lib.rs +0 -0
  13. {shellsim-0.1.12 → shellsim-0.1.14}/python/shellsim/__init__.py +0 -0
  14. {shellsim-0.1.12 → shellsim-0.1.14}/python/shellsim/__main__.py +0 -0
  15. {shellsim-0.1.12 → shellsim-0.1.14}/python/shellsim/_api.py +0 -0
  16. {shellsim-0.1.12 → shellsim-0.1.14}/python/shellsim/_cli.py +0 -0
  17. {shellsim-0.1.12 → shellsim-0.1.14}/python/shellsim/py.typed +0 -0
  18. {shellsim-0.1.12 → shellsim-0.1.14}/python/shellsim/python.py +0 -0
  19. {shellsim-0.1.12 → shellsim-0.1.14}/rust-toolchain.toml +0 -0
  20. {shellsim-0.1.12 → shellsim-0.1.14}/src/bin/shellsim-python.rs +0 -0
  21. {shellsim-0.1.12 → shellsim-0.1.14}/src/clock.rs +0 -0
  22. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/archives.rs +0 -0
  23. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/awk/ast.rs +0 -0
  24. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/awk/eval.rs +0 -0
  25. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/awk/lexer.rs +0 -0
  26. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/awk/parser.rs +0 -0
  27. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/awk.rs +0 -0
  28. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/builtins.rs +0 -0
  29. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/dd.rs +0 -0
  30. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/echo.rs +0 -0
  31. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/find.rs +0 -0
  32. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/fs.rs +0 -0
  33. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/apply.rs +0 -0
  34. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/commit.rs +0 -0
  35. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/compare.rs +0 -0
  36. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/config.rs +0 -0
  37. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/conflict.rs +0 -0
  38. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/diff.rs +0 -0
  39. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/ignore.rs +0 -0
  40. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/import.rs +0 -0
  41. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/log.rs +0 -0
  42. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/merge.rs +0 -0
  43. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/mod.rs +0 -0
  44. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/plumbing.rs +0 -0
  45. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/rebase.rs +0 -0
  46. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/refs.rs +0 -0
  47. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/repo.rs +0 -0
  48. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/stash.rs +0 -0
  49. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/switch.rs +0 -0
  50. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/git/worktree.rs +0 -0
  51. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/hashing.rs +0 -0
  52. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/makecmd.rs +0 -0
  53. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/mod.rs +0 -0
  54. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/net.rs +0 -0
  55. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/options.rs +0 -0
  56. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/patch.rs +0 -0
  57. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/pkg.rs +0 -0
  58. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/printf.rs +0 -0
  59. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/proc.rs +0 -0
  60. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/regex_compat.rs +0 -0
  61. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/rgcmd.rs +0 -0
  62. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/sed.rs +0 -0
  63. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/sort.rs +0 -0
  64. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/system.rs +0 -0
  65. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/tarcmd.rs +0 -0
  66. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/text.rs +0 -0
  67. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/unavailable.rs +0 -0
  68. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/util.rs +0 -0
  69. {shellsim-0.1.12 → shellsim-0.1.14}/src/commands/zipcmd.rs +0 -0
  70. {shellsim-0.1.12 → shellsim-0.1.14}/src/descriptors.rs +0 -0
  71. {shellsim-0.1.12 → shellsim-0.1.14}/src/exec.rs +0 -0
  72. {shellsim-0.1.12 → shellsim-0.1.14}/src/expand.rs +0 -0
  73. {shellsim-0.1.12 → shellsim-0.1.14}/src/harness.rs +0 -0
  74. {shellsim-0.1.12 → shellsim-0.1.14}/src/harness_manager.rs +0 -0
  75. {shellsim-0.1.12 → shellsim-0.1.14}/src/hashes.rs +0 -0
  76. {shellsim-0.1.12 → shellsim-0.1.14}/src/host_ingest.rs +0 -0
  77. {shellsim-0.1.12 → shellsim-0.1.14}/src/interp.rs +0 -0
  78. {shellsim-0.1.12 → shellsim-0.1.14}/src/jqcmd.rs +0 -0
  79. {shellsim-0.1.12 → shellsim-0.1.14}/src/lib.rs +0 -0
  80. {shellsim-0.1.12 → shellsim-0.1.14}/src/main.rs +0 -0
  81. {shellsim-0.1.12 → shellsim-0.1.14}/src/mcp.rs +0 -0
  82. {shellsim-0.1.12 → shellsim-0.1.14}/src/net.rs +0 -0
  83. {shellsim-0.1.12 → shellsim-0.1.14}/src/netcmd.rs +0 -0
  84. {shellsim-0.1.12 → shellsim-0.1.14}/src/process.rs +0 -0
  85. {shellsim-0.1.12 → shellsim-0.1.14}/src/pseudo_fs.rs +0 -0
  86. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/ast.rs +0 -0
  87. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/bytecode.rs +0 -0
  88. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/compiler.rs +0 -0
  89. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/filesystem.rs +0 -0
  90. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/heap.rs +0 -0
  91. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/http.rs +0 -0
  92. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/lexer.rs +0 -0
  93. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/mapping.rs +0 -0
  94. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/mod.rs +0 -0
  95. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/native.rs +0 -0
  96. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/number.rs +0 -0
  97. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/object_model.rs +0 -0
  98. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/parser.rs +0 -0
  99. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/process.rs +0 -0
  100. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/slice.rs +0 -0
  101. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/source.rs +0 -0
  102. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/argparse.rs +0 -0
  103. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/asyncio.rs +0 -0
  104. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/base64.rs +0 -0
  105. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/bisect.rs +0 -0
  106. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/collections.rs +0 -0
  107. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/core.rs +0 -0
  108. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/dataclasses.rs +0 -0
  109. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/enum.rs +0 -0
  110. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/frozen.rs +0 -0
  111. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/functools.rs +0 -0
  112. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/hashlib.rs +0 -0
  113. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/heapq.rs +0 -0
  114. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/http.rs +0 -0
  115. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/importlib.rs +0 -0
  116. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/itertools.rs +0 -0
  117. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/json.rs +0 -0
  118. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/math.rs +0 -0
  119. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/mod.rs +0 -0
  120. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/numpy.rs +0 -0
  121. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/os.rs +0 -0
  122. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/pytest.rs +0 -0
  123. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/re.rs +0 -0
  124. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/abc.py +0 -0
  125. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/base64.py +0 -0
  126. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/cmath.py +0 -0
  127. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/codecs.py +0 -0
  128. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/collections.py +0 -0
  129. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/complex.py +0 -0
  130. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/copy.py +0 -0
  131. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/csv.py +0 -0
  132. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/datetime.py +0 -0
  133. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/glob.py +0 -0
  134. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/hashlib.py +0 -0
  135. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/http.py +0 -0
  136. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/http_client.py +0 -0
  137. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/importlib.py +0 -0
  138. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/io.py +0 -0
  139. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/json.py +0 -0
  140. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/logging.py +0 -0
  141. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/numpy_random.py +0 -0
  142. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/os.py +0 -0
  143. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/pathlib.py +0 -0
  144. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/pytest.py +0 -0
  145. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/random.py +0 -0
  146. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/shutil.py +0 -0
  147. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/statistics.py +0 -0
  148. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/struct.py +0 -0
  149. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/subprocess.py +0 -0
  150. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/tempfile.py +0 -0
  151. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/textwrap.py +0 -0
  152. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/urllib.py +0 -0
  153. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/urllib_error.py +0 -0
  154. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/urllib_request.py +0 -0
  155. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/uuid.py +0 -0
  156. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/zipfile.py +0 -0
  157. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/source/zlib.py +0 -0
  158. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/string.rs +0 -0
  159. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/struct.rs +0 -0
  160. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/subprocess.rs +0 -0
  161. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/sys.rs +0 -0
  162. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/time.rs +0 -0
  163. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/typing.rs +0 -0
  164. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/unittest.rs +0 -0
  165. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/vfs.rs +0 -0
  166. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/stdlib/zlib.rs +0 -0
  167. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/string.rs +0 -0
  168. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/token.rs +0 -0
  169. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/dispatch.rs +0 -0
  170. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/host.rs +0 -0
  171. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/iteration.rs +0 -0
  172. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/namespace.rs +0 -0
  173. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/native_runtime.rs +0 -0
  174. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/objects.rs +0 -0
  175. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm/operations.rs +0 -0
  176. {shellsim-0.1.12 → shellsim-0.1.14}/src/python/vm.rs +0 -0
  177. {shellsim-0.1.12 → shellsim-0.1.14}/src/resources.rs +0 -0
  178. {shellsim-0.1.12 → shellsim-0.1.14}/src/sandbox.rs +0 -0
  179. {shellsim-0.1.12 → shellsim-0.1.14}/src/scenario.rs +0 -0
  180. {shellsim-0.1.12 → shellsim-0.1.14}/src/scheduler.rs +0 -0
  181. {shellsim-0.1.12 → shellsim-0.1.14}/src/shell.rs +0 -0
  182. {shellsim-0.1.12 → shellsim-0.1.14}/src/telemetry.rs +0 -0
  183. {shellsim-0.1.12 → shellsim-0.1.14}/src/vfs.rs +0 -0
@@ -330,7 +330,7 @@ dependencies = [
330
330
 
331
331
  [[package]]
332
332
  name = "shellsim"
333
- version = "0.1.12"
333
+ version = "0.1.14"
334
334
  dependencies = [
335
335
  "base64",
336
336
  "crc32fast",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "shellsim"
3
- version = "0.1.12"
3
+ version = "0.1.14"
4
4
  edition = "2021"
5
5
  description = "In-process BusyBox-like environment for RL rollouts and agent tests"
6
6
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shellsim
3
- Version: 0.1.12
3
+ Version: 0.1.14
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: License :: OSI Approved :: Apache Software License
6
6
  Classifier: Operating System :: MacOS :: MacOS X
@@ -406,7 +406,7 @@ dependencies = [
406
406
 
407
407
  [[package]]
408
408
  name = "shellsim"
409
- version = "0.1.12"
409
+ version = "0.1.14"
410
410
  dependencies = [
411
411
  "base64",
412
412
  "crc32fast",
@@ -427,7 +427,7 @@ dependencies = [
427
427
 
428
428
  [[package]]
429
429
  name = "shellsim-python-bindings"
430
- version = "0.1.12"
430
+ version = "0.1.14"
431
431
  dependencies = [
432
432
  "pyo3",
433
433
  "serde",
@@ -2,7 +2,7 @@
2
2
 
3
3
  [package]
4
4
  name = "shellsim-python-bindings"
5
- version = "0.1.12"
5
+ version = "0.1.14"
6
6
  edition = "2021"
7
7
  description = "Python bindings for shellsim"
8
8
  license = "Apache-2.0"
@@ -20,6 +20,25 @@ pub fn display(heap: &Heap, value: &Value) -> Result<String, String> {
20
20
  if let Some((kind, message)) = exception_parts(heap, value)? {
21
21
  return Ok(if message.is_empty() { kind } else { message });
22
22
  }
23
+ if let Some((_, args)) = user_exception_parts(heap, value)? {
24
+ return match args.as_slice() {
25
+ [] => Ok(String::new()),
26
+ [only] => {
27
+ if let Some(value) = string_value(heap, only)? {
28
+ Ok(value)
29
+ } else {
30
+ repr(heap, only)
31
+ }
32
+ }
33
+ _ => {
34
+ let values = args
35
+ .iter()
36
+ .map(|value| repr(heap, value))
37
+ .collect::<Result<Vec<_>, _>>()?;
38
+ Ok(format!("({})", values.join(", ")))
39
+ }
40
+ };
41
+ }
23
42
  repr(heap, value)
24
43
  }
25
44
 
@@ -100,6 +119,41 @@ pub fn exception_parts(heap: &Heap, value: &Value) -> Result<Option<(String, Str
100
119
  })
101
120
  }
102
121
 
122
+ fn user_exception_parts(
123
+ heap: &Heap,
124
+ value: &Value,
125
+ ) -> Result<Option<(String, Vec<Value>)>, String> {
126
+ let Some(id) = value.object_id() else {
127
+ return Ok(None);
128
+ };
129
+ let Object::Instance { class, .. } = heap.get(id)? else {
130
+ return Ok(None);
131
+ };
132
+ let Object::Class {
133
+ name,
134
+ exception_base,
135
+ ..
136
+ } = heap.get(*class)?
137
+ else {
138
+ return Ok(None);
139
+ };
140
+ if exception_base.is_none() {
141
+ return Ok(None);
142
+ }
143
+ let args = if let Some(symbol) = heap.symbol_id("args") {
144
+ heap.attribute_by_symbol(id, symbol)?
145
+ .and_then(|value| value.object_id())
146
+ .and_then(|args| match heap.get(args).ok()? {
147
+ Object::Tuple(values) => Some(values.clone()),
148
+ _ => None,
149
+ })
150
+ .unwrap_or_default()
151
+ } else {
152
+ Vec::new()
153
+ };
154
+ Ok(Some((name.clone(), args)))
155
+ }
156
+
103
157
  fn bigint_value<'a>(heap: &'a Heap, value: &Value) -> Option<&'a BigInt> {
104
158
  let id = value.object_id()?;
105
159
  match heap.get(id).ok()? {
@@ -244,6 +298,15 @@ fn render(heap: &Heap, value: &Value, active: &mut BTreeSet<ObjectId>) -> Result
244
298
  Object::Instance { class, payload, .. } => match payload {
245
299
  InstancePayload::Int(value) => value.to_string(),
246
300
  InstancePayload::Object => match heap.get(*class)? {
301
+ Object::Class {
302
+ name,
303
+ exception_base: Some(_),
304
+ ..
305
+ } => {
306
+ let (_, args) = user_exception_parts(heap, value)?
307
+ .ok_or("exception instance lost its native base")?;
308
+ format!("{name}({})", render_values(heap, &args, active)?.join(", "))
309
+ }
247
310
  Object::Class { name, .. } => format!("<{name} object>"),
248
311
  _ => return Err("instance has an invalid class".into()),
249
312
  },