openscad-cpp-evaluator 0.26.0__tar.gz → 0.27.0__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 (199) hide show
  1. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/evaluator.hpp +4 -0
  3. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/csg_generate.cpp +32 -0
  5. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/debug_profile.cpp +24 -2
  6. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_debug_hooks.cpp +40 -0
  7. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_manifold_cache.cpp +51 -0
  8. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/.github/workflows/ci.yml +0 -0
  9. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/.github/workflows/wheels.yml +0 -0
  10. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/.gitignore +0 -0
  11. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/.gitmodules +0 -0
  12. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/CLAUDE.md +0 -0
  13. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/CMakeLists.txt +0 -0
  14. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/LICENSE +0 -0
  15. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/README.md +0 -0
  16. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/bindings/CMakeLists.txt +0 -0
  17. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/bindings/ast_to_py.cpp +0 -0
  18. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/bindings/module.cpp +0 -0
  19. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/cmake/embed_font.cmake +0 -0
  20. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/examples/CMakeLists.txt +0 -0
  21. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/examples/eval_perf_benchmark.cpp +0 -0
  22. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/examples/manifold_cache_reuse.cpp +0 -0
  23. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/examples/minimal_debugger.cpp +0 -0
  24. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  25. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/.gitignore +0 -0
  26. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  27. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  28. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/README.md +0 -0
  29. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  30. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  31. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  32. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  33. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  34. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  35. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  36. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  37. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  38. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  39. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  40. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  41. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  42. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  43. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  44. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  45. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
  46. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  47. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  48. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  49. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  50. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  51. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  52. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  53. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  54. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  55. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  56. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  57. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  58. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  59. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  60. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  61. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  62. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
  63. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  64. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  65. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  66. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  67. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  68. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  69. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  70. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  71. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  72. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  73. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  74. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  75. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  76. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  77. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  78. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  79. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  80. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  81. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  82. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  83. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  84. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  85. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  86. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  87. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  88. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  89. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  90. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  91. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  92. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  93. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  94. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  95. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  96. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  97. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  98. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  99. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  100. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  101. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  102. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  103. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  104. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  105. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
  106. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  107. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  108. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  109. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  110. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  111. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  112. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  113. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  114. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  115. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  116. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
  117. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  118. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  119. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
  120. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  121. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
  122. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/resources/fonts/LICENSE +0 -0
  123. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  124. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/CMakeLists.txt +0 -0
  125. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/booleans.cpp +0 -0
  126. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/builtins.hpp +0 -0
  127. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/call_args.cpp +0 -0
  128. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/color.cpp +0 -0
  129. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/control.cpp +0 -0
  130. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/extrude.cpp +0 -0
  131. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/function_builtins.cpp +0 -0
  132. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/import.cpp +0 -0
  133. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/modifiers.cpp +0 -0
  134. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/primitives_2d.cpp +0 -0
  135. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/primitives_3d.cpp +0 -0
  136. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/registry.cpp +0 -0
  137. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/roof.cpp +0 -0
  138. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/segments.cpp +0 -0
  139. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/surface.cpp +0 -0
  140. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/text.cpp +0 -0
  141. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/topology.cpp +0 -0
  142. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/builtins/transforms.cpp +0 -0
  143. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/bytecode_compiler.cpp +0 -0
  144. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/bytecode_vm.cpp +0 -0
  145. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/colored_body.cpp +0 -0
  146. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/csg_resolve.cpp +0 -0
  147. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/css_colors.cpp +0 -0
  148. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/debug/debug_repl.cpp +0 -0
  149. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/eval_context.cpp +0 -0
  150. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/eval_error.cpp +0 -0
  151. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/eval_use.cpp +0 -0
  152. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/export.cpp +0 -0
  153. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/expr_eval.cpp +0 -0
  154. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/import/dxf_import.cpp +0 -0
  155. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/import/mesh_import.cpp +0 -0
  156. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/import/surface_load.cpp +0 -0
  157. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/import/svg_import.cpp +0 -0
  158. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/manifold_cache.cpp +0 -0
  159. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/mesh_check.cpp +0 -0
  160. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/stmt_eval.cpp +0 -0
  161. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/text/stb_font_provider.cpp +0 -0
  162. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/text/text_metrics.cpp +0 -0
  163. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/user_calls.cpp +0 -0
  164. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/value.cpp +0 -0
  165. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/src/zip_stored.cpp +0 -0
  166. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/CMakeLists.txt +0 -0
  167. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_booleans.cpp +0 -0
  168. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_bytecode_compiler.cpp +0 -0
  169. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_cli.cpp +0 -0
  170. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_control_flow.cpp +0 -0
  171. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_csg_tree.cpp +0 -0
  172. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_dxf_svg_import.cpp +0 -0
  173. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_eval_context.cpp +0 -0
  174. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_export.cpp +0 -0
  175. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_expr_eval.cpp +0 -0
  176. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_extrude_roof.cpp +0 -0
  177. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_function_builtins.cpp +0 -0
  178. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_helpers.hpp +0 -0
  179. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_import_export.cpp +0 -0
  180. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_mesh_check.cpp +0 -0
  181. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_multi_color_merge.cpp +0 -0
  182. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_primitives.cpp +0 -0
  183. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_profiling.cpp +0 -0
  184. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_python_bindings.py +0 -0
  185. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_scope_trail.cpp +0 -0
  186. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_scoping.cpp +0 -0
  187. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_surface.cpp +0 -0
  188. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_tail_calls.cpp +0 -0
  189. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_text.cpp +0 -0
  190. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_transforms.cpp +0 -0
  191. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_use.cpp +0 -0
  192. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_value.cpp +0 -0
  193. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_viewport_params.cpp +0 -0
  194. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tests/test_zip_stored.cpp +0 -0
  195. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tools/cli/CMakeLists.txt +0 -0
  196. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tools/cli/cli_lib.cpp +0 -0
  197. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tools/cli/cli_lib.hpp +0 -0
  198. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/tools/cli/main.cpp +0 -0
  199. {openscad_cpp_evaluator-0.26.0 → openscad_cpp_evaluator-0.27.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.26.0
3
+ Version: 0.27.0
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -223,6 +223,10 @@ public:
223
223
  // evaluate()/resolveTree()+generateTree() complete. Mirrors the
224
224
  // reference's Evaluator.id_to_node/id_to_color (also plain public
225
225
  // attributes there).
226
+ // Give cached bodies fresh originalIDs so a second call site reusing
227
+ // them is not confused with the first. See its definition.
228
+ void restampCachedIds(std::vector<ColoredBody>& bodies);
229
+
226
230
  std::unordered_map<uint32_t, const oscad::ASTNode*> idToNode;
227
231
  std::unordered_map<uint32_t, std::optional<std::array<float, 4>>> idToColor;
228
232
 
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.26.0"
7
+ version = "0.27.0"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -48,6 +48,7 @@ std::vector<ColoredBody> Evaluator::generateTreeImpl(const std::vector<CSGNode*>
48
48
  std::optional<std::vector<ColoredBody>> cached = key ? manifoldCache_->get(*key) : std::nullopt;
49
49
  if (cached) {
50
50
  node.bodies = std::move(*cached);
51
+ restampCachedIds(node.bodies);
51
52
  } else {
52
53
  // Recurse into children first (bottom-up) -- populates each
53
54
  // child's own .bodies in place so flattenCsgTree/a GenerateFn
@@ -104,6 +105,37 @@ std::vector<ColoredBody> Evaluator::generatePartialTree() {
104
105
  return generateTreeImpl(flat);
105
106
  }
106
107
 
108
+ void Evaluator::restampCachedIds(std::vector<ColoredBody>& bodies) {
109
+ // A cache hit hands back the geometry AND the originalIDs of whichever
110
+ // call site first produced it. Those IDs are provenance -- "which node
111
+ // made this" -- not content, so two identical shapes at two call sites
112
+ // came back sharing one identity and selecting either picked both.
113
+ //
114
+ // Each distinct run gets a fresh ID, one per run rather than one per
115
+ // body, so a cached subtree made of several parts stays selectable
116
+ // part by part. Each new ID inherits the old one's node and color, so
117
+ // the parts keep pointing at the AST nodes that really produced them.
118
+ for (ColoredBody& cb : bodies) {
119
+ if (!cb.body || cb.body->IsEmpty()) continue;
120
+ manifold::MeshGL mesh = cb.body->GetMeshGL();
121
+ if (mesh.runOriginalID.empty()) continue;
122
+ std::unordered_map<uint32_t, uint32_t> remap;
123
+ for (uint32_t& id : mesh.runOriginalID) {
124
+ auto found = remap.find(id);
125
+ if (found == remap.end()) {
126
+ const uint32_t fresh = manifold::Manifold::ReserveIDs(1);
127
+ auto node = idToNode.find(id);
128
+ if (node != idToNode.end()) idToNode[fresh] = node->second;
129
+ auto color = idToColor.find(id);
130
+ if (color != idToColor.end()) idToColor[fresh] = color->second;
131
+ found = remap.emplace(id, fresh).first;
132
+ }
133
+ id = found->second;
134
+ }
135
+ cb.body = manifold::Manifold(mesh);
136
+ }
137
+ }
138
+
107
139
  ColoredBody Evaluator::tagGenerated(manifold::Manifold body, const oscad::ASTNode& node, const Value& colorValue) {
108
140
  manifold::MeshGL mesh = body.GetMeshGL();
109
141
  std::optional<std::array<float, 4>> color = valueToColor(colorValue);
@@ -9,9 +9,31 @@ namespace {
9
9
  // call), if any. See Evaluator::lastChildrenPositions()'s own doc comment
10
10
  // for what this feeds. Mirrors the reference's own
11
11
  // Evaluator._child_statement_positions.
12
- std::optional<std::vector<std::pair<std::string, int>>> childStatementPositions(const oscad::ASTNode& node) {
12
+ // Where a debugger's "step into child" should aim from `node`.
13
+ //
14
+ // Normally the node's own children -- `framed(20) leaf(3);` aims at
15
+ // `leaf(3)`. But a `children()` call has no children of its own: it
16
+ // forwards the enclosing invocation's, which live on the context. Without
17
+ // that case, stepping to a child from the one statement whose entire job
18
+ // is to run the children found nothing to aim at, and the step silently
19
+ // degraded into a continue -- running to the next breakpoint or off the
20
+ // end of the script.
21
+ std::optional<std::vector<std::pair<std::string, int>>> childStatementPositions(const oscad::ASTNode& node,
22
+ const EvalContext& ctx) {
13
23
  if (node.kind() != oscad::NodeKind::ModularCall) return std::nullopt;
14
24
  const auto& call = static_cast<const oscad::ModularCall&>(node);
25
+ if (call.name && call.name->name == "children") {
26
+ if (!ctx.childrenNodes || ctx.childrenNodes->empty()) return std::nullopt;
27
+ std::vector<std::pair<std::string, int>> forwarded;
28
+ for (const oscad::ASTNode* c : *ctx.childrenNodes) {
29
+ if (c) forwarded.emplace_back(c->position().origin, c->position().line);
30
+ }
31
+ if (forwarded.empty()) return std::nullopt;
32
+ // Every forwarded child, even when an index argument (children(0),
33
+ // children([1:2])) will run only some: a position that is never
34
+ // reached can never be stopped at, so the extra targets are inert.
35
+ return forwarded;
36
+ }
15
37
  std::vector<std::pair<std::string, int>> positions;
16
38
  for (const auto& c : call.children) {
17
39
  if (c->kind() == oscad::NodeKind::Assignment || c->kind() == oscad::NodeKind::ModuleDeclaration ||
@@ -121,7 +143,7 @@ void Evaluator::checkDebug(const oscad::ASTNode& node, EvalContext& ctx, bool fo
121
143
  }
122
144
  const int depth = static_cast<int>(callStack_.size());
123
145
  const DebugFramesFn getFrame = [this, &ctx]() { return buildDebugFrames(&ctx); };
124
- lastChildrenPositions_ = childStatementPositions(node);
146
+ lastChildrenPositions_ = childStatementPositions(node, ctx);
125
147
 
126
148
  DebugAction action = debugHooks_.debugHook(pos.line, depth, forced, exprLevel, pos.origin, callStack_, getFrame);
127
149
  for (auto& [k, v] : action.mods) ctx.let_->set(k, v);
@@ -641,6 +641,46 @@ TEST(DebugHooksParity, CallSiteOnItsOwnLineStillStops) {
641
641
  EXPECT_EQ(line4, 2);
642
642
  }
643
643
 
644
+ // Step-into-child aims at the children a `children()` call forwards, not
645
+ // at its own (it has none). Without this, the one statement whose entire
646
+ // job is to run the children offered a debugger nothing to aim at, and the
647
+ // step degraded into a continue -- running off the end of the script.
648
+ TEST(DebugHooksChildren, ChildrenCallForwardsItsCallersChildrenAsStepTargets) {
649
+ // Line 5 is the child; line 2 is the `children();` that forwards it.
650
+ const char* src = "module framed(gap) {\n"
651
+ " children();\n"
652
+ "}\n"
653
+ "framed(20)\n"
654
+ " leaf();\n"
655
+ "module leaf() { cube(1); }\n";
656
+ std::vector<std::pair<int, std::vector<std::pair<std::string, int>>>> seen;
657
+ DebugHooks hooks;
658
+ Evaluator* evp = nullptr;
659
+ hooks.debugHook = [&](int line, int, bool, bool exprLevel, const std::string&,
660
+ const std::vector<CallStackFrame>&, const DebugFramesFn&) {
661
+ if (!exprLevel && evp && evp->lastChildrenPositions())
662
+ seen.emplace_back(line, *evp->lastChildrenPositions());
663
+ return DebugAction{};
664
+ };
665
+ Evaluator ev(EchoFn{}, nullptr, nullptr, hooks);
666
+ evp = &ev;
667
+ auto ast = parseSrc(src);
668
+ auto scope = oscad::buildScopes(ast);
669
+ EvalContext ctx = EvalContext::makeRoot(scope.get());
670
+ ev.evaluate(ast, ctx);
671
+
672
+ // At `children();` on line 2, the target is the forwarded child on
673
+ // line 5 -- not nothing, and not the children() call's own position.
674
+ bool found = false;
675
+ for (const auto& [line, positions] : seen) {
676
+ if (line != 2) continue;
677
+ found = true;
678
+ ASSERT_EQ(positions.size(), 1u);
679
+ EXPECT_EQ(positions.front().second, 5);
680
+ }
681
+ EXPECT_TRUE(found) << "no statement-level stop at the children() call";
682
+ }
683
+
644
684
  TEST(DebugHooksParity, BuiltinFunctionCallGetsNoCallSiteStop) {
645
685
  // Only the assignment is statement-level; the 3 expr-level stops are
646
686
  // the argument list literal's own elements, not a call-site stop.
@@ -5,7 +5,10 @@
5
5
  #include "test_helpers.hpp"
6
6
 
7
7
  #include <gtest/gtest.h>
8
+ #include <algorithm>
9
+ #include <iterator>
8
10
  #include <numbers>
11
+ #include <set>
9
12
 
10
13
  using namespace oscadeval;
11
14
  using namespace oscadeval::test;
@@ -156,6 +159,54 @@ TEST(ManifoldCache, UncacheableNodeAlwaysRegeneratesNeverHitsOrPopulatesCache) {
156
159
  EXPECT_FALSE(second.ev.idToNode.empty());
157
160
  }
158
161
 
162
+ // A cache hit must not hand back the originalIDs of whichever call site
163
+ // first produced the geometry. Those IDs are provenance, and sharing them
164
+ // made two identical shapes one thing to a UI: selecting either picked
165
+ // both. Common in CAD, where arrays of identical parts are the norm.
166
+ TEST(ManifoldCache, IdenticalShapesAtDifferentCallSitesGetDistinctOriginalIds) {
167
+ auto cache = std::make_shared<ManifoldCache>();
168
+ Evaluated e = evalSrcWithCache(
169
+ "translate([0,0,0]) cylinder(h=20,r=4,$fn=32);\n"
170
+ "translate([25,0,0]) cylinder(h=20,r=4,$fn=32);\n", cache);
171
+ ASSERT_EQ(e.bodies.size(), 2u);
172
+
173
+ // Held in locals: GetMeshGL() returns by value, so taking begin() and
174
+ // end() from two separate calls walks between unrelated buffers.
175
+ const manifold::MeshGL meshA = e.bodies[0].body->GetMeshGL();
176
+ const manifold::MeshGL meshB = e.bodies[1].body->GetMeshGL();
177
+ const std::set<uint32_t> first(meshA.runOriginalID.begin(), meshA.runOriginalID.end());
178
+ const std::set<uint32_t> second(meshB.runOriginalID.begin(), meshB.runOriginalID.end());
179
+ ASSERT_FALSE(first.empty());
180
+ ASSERT_FALSE(second.empty());
181
+ std::vector<uint32_t> shared;
182
+ std::set_intersection(first.begin(), first.end(), second.begin(), second.end(),
183
+ std::back_inserter(shared));
184
+ EXPECT_TRUE(shared.empty()) << "the two cylinders share an originalID";
185
+
186
+ // Both still resolve to a node, so re-stamping does not lose the
187
+ // mapping selection needs.
188
+ for (uint32_t id : first) EXPECT_EQ(e.ev.idToNode.count(id), 1u);
189
+ for (uint32_t id : second) EXPECT_EQ(e.ev.idToNode.count(id), 1u);
190
+ }
191
+
192
+ // Re-stamping is per run, not per body, so a cached subtree made of
193
+ // several parts stays selectable part by part rather than collapsing into
194
+ // one -- which is what Manifold's own AsOriginal() would have done.
195
+ TEST(ManifoldCache, ACachedMultiPartSubtreeKeepsOneIdPerPart) {
196
+ auto cache = std::make_shared<ManifoldCache>();
197
+ Evaluated e = evalSrcWithCache(
198
+ "module pair() { cube(2); translate([5,0,0]) sphere(1,$fn=8); }\n"
199
+ "pair();\n"
200
+ "translate([0,20,0]) pair();\n", cache);
201
+ ASSERT_EQ(e.bodies.size(), 4u);
202
+ std::set<uint32_t> all;
203
+ for (const ColoredBody& b : e.bodies) {
204
+ const manifold::MeshGL mesh = b.body->GetMeshGL();
205
+ for (uint32_t id : mesh.runOriginalID) all.insert(id);
206
+ }
207
+ EXPECT_EQ(all.size(), 4u) << "parts of the reused subtree share IDs";
208
+ }
209
+
159
210
  TEST(ManifoldCache, OutputIsIdenticalCacheOnVsCacheOffAcrossBuiltinCategories) {
160
211
  const std::vector<std::string> scripts = {
161
212
  "cube(3);",