openscad-cpp-evaluator 0.21.0__tar.gz → 0.22.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 (196) hide show
  1. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/pyproject.toml +1 -1
  3. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/debug_profile.cpp +19 -6
  4. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_profiling.cpp +65 -0
  5. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/.github/workflows/ci.yml +0 -0
  6. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/.github/workflows/wheels.yml +0 -0
  7. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/.gitignore +0 -0
  8. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/.gitmodules +0 -0
  9. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/CLAUDE.md +0 -0
  10. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/CMakeLists.txt +0 -0
  11. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/LICENSE +0 -0
  12. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/README.md +0 -0
  13. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/bindings/CMakeLists.txt +0 -0
  14. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/bindings/ast_to_py.cpp +0 -0
  15. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/bindings/module.cpp +0 -0
  16. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/cmake/embed_font.cmake +0 -0
  17. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/examples/CMakeLists.txt +0 -0
  18. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/examples/eval_perf_benchmark.cpp +0 -0
  19. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/examples/manifold_cache_reuse.cpp +0 -0
  20. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/examples/minimal_debugger.cpp +0 -0
  21. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  22. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/.gitignore +0 -0
  23. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  24. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  25. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/README.md +0 -0
  26. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  27. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  28. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  29. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  30. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  31. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  32. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  33. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  34. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  35. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  36. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  37. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  38. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  39. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  40. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  41. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  42. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
  43. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  44. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  45. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  46. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  47. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  48. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  49. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  50. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  51. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  52. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  53. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  54. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  55. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  56. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  57. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  58. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  59. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
  60. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  61. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  62. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  63. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  64. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  65. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  66. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  67. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  68. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  69. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  70. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  71. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  72. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  73. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  74. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  75. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  76. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  77. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  78. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  79. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  80. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  81. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  82. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  83. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  84. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  85. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  86. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  87. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  88. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  89. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  90. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  91. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  92. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  93. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  94. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  95. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  96. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  97. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  98. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  99. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  100. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  101. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  102. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  103. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
  104. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  105. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  106. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  107. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  108. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  109. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  110. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  111. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  112. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  113. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
  114. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  115. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  116. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
  117. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  118. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
  119. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/resources/fonts/LICENSE +0 -0
  120. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  121. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/CMakeLists.txt +0 -0
  122. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/booleans.cpp +0 -0
  123. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/builtins.hpp +0 -0
  124. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/call_args.cpp +0 -0
  125. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/color.cpp +0 -0
  126. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/control.cpp +0 -0
  127. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/extrude.cpp +0 -0
  128. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/function_builtins.cpp +0 -0
  129. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/import.cpp +0 -0
  130. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/modifiers.cpp +0 -0
  131. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/primitives_2d.cpp +0 -0
  132. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/primitives_3d.cpp +0 -0
  133. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/registry.cpp +0 -0
  134. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/roof.cpp +0 -0
  135. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/segments.cpp +0 -0
  136. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/surface.cpp +0 -0
  137. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/text.cpp +0 -0
  138. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/topology.cpp +0 -0
  139. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/builtins/transforms.cpp +0 -0
  140. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/bytecode_compiler.cpp +0 -0
  141. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/bytecode_vm.cpp +0 -0
  142. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/colored_body.cpp +0 -0
  143. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/csg_generate.cpp +0 -0
  144. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/csg_resolve.cpp +0 -0
  145. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/css_colors.cpp +0 -0
  146. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/debug/debug_repl.cpp +0 -0
  147. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/eval_context.cpp +0 -0
  148. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/eval_error.cpp +0 -0
  149. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/eval_use.cpp +0 -0
  150. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/export.cpp +0 -0
  151. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/expr_eval.cpp +0 -0
  152. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/import/dxf_import.cpp +0 -0
  153. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/import/mesh_import.cpp +0 -0
  154. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/import/surface_load.cpp +0 -0
  155. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/import/svg_import.cpp +0 -0
  156. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/manifold_cache.cpp +0 -0
  157. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/stmt_eval.cpp +0 -0
  158. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/text/stb_font_provider.cpp +0 -0
  159. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/text/text_metrics.cpp +0 -0
  160. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/user_calls.cpp +0 -0
  161. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/value.cpp +0 -0
  162. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/src/zip_stored.cpp +0 -0
  163. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/CMakeLists.txt +0 -0
  164. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_booleans.cpp +0 -0
  165. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_bytecode_compiler.cpp +0 -0
  166. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_cli.cpp +0 -0
  167. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_control_flow.cpp +0 -0
  168. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_csg_tree.cpp +0 -0
  169. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_debug_hooks.cpp +0 -0
  170. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_dxf_svg_import.cpp +0 -0
  171. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_eval_context.cpp +0 -0
  172. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_export.cpp +0 -0
  173. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_expr_eval.cpp +0 -0
  174. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_extrude_roof.cpp +0 -0
  175. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_function_builtins.cpp +0 -0
  176. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_helpers.hpp +0 -0
  177. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_import_export.cpp +0 -0
  178. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_manifold_cache.cpp +0 -0
  179. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_multi_color_merge.cpp +0 -0
  180. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_primitives.cpp +0 -0
  181. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_python_bindings.py +0 -0
  182. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_scope_trail.cpp +0 -0
  183. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_scoping.cpp +0 -0
  184. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_surface.cpp +0 -0
  185. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_tail_calls.cpp +0 -0
  186. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_text.cpp +0 -0
  187. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_transforms.cpp +0 -0
  188. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_use.cpp +0 -0
  189. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_value.cpp +0 -0
  190. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_viewport_params.cpp +0 -0
  191. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tests/test_zip_stored.cpp +0 -0
  192. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tools/cli/CMakeLists.txt +0 -0
  193. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tools/cli/cli_lib.cpp +0 -0
  194. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tools/cli/cli_lib.hpp +0 -0
  195. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/tools/cli/main.cpp +0 -0
  196. {openscad_cpp_evaluator-0.21.0 → openscad_cpp_evaluator-0.22.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.21.0
3
+ Version: 0.22.0
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.21.0"
7
+ version = "0.22.0"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -127,14 +127,27 @@ int Evaluator::profilePathEnter(const std::string& kind, const std::string& name
127
127
  }
128
128
  const int parent = profileCurrentPath_ < 0 ? 0 : profileCurrentPath_;
129
129
 
130
- // Already on this path? Fold onto that node rather than growing a chain
131
- // per recursive level (see ProfilePathNode).
132
- for (int walk = parent; walk > 0; walk = profilePaths_[static_cast<size_t>(walk)].parent) {
133
- const ProfilePathNode& n = profilePaths_[static_cast<size_t>(walk)];
130
+ // Immediate self-recursion folds onto the parent rather than growing a
131
+ // chain per level (see ProfilePathNode).
132
+ //
133
+ // Only the parent, never a deeper ancestor. Folding across intervening
134
+ // nodes credits the whole re-entered subtree to the ancestor, and every
135
+ // node between it and here loses that time -- cumulative is derived
136
+ // bottom-up, so it can only count what is actually below. A BOSL2
137
+ // attachment chain showed restore() at 226ms in the flat view and 2.5ms
138
+ // in the tree for the same call site, because its callees re-entered a
139
+ // multmatrix already open further up and took 223ms with them.
140
+ //
141
+ // A cycle through other call sites therefore gets a real node. That is
142
+ // what makes the tree's numbers agree with the flat view's; the cost is
143
+ // more nodes on mutually-recursive chains, which kMaxProfilePathNodes
144
+ // still bounds.
145
+ if (parent > 0) {
146
+ const ProfilePathNode& n = profilePaths_[static_cast<size_t>(parent)];
134
147
  if (n.name == name && n.callOrigin == callOrigin && n.callLine == callLine &&
135
148
  n.callColumn == callColumn && n.kind == kind) {
136
- folded = true; // recursion: this site is already open on this path
137
- return walk;
149
+ folded = true; // direct recursion: this site called itself
150
+ return parent;
138
151
  }
139
152
  }
140
153
  for (int childIdx : profilePaths_[static_cast<size_t>(parent)].children) {
@@ -259,6 +259,71 @@ TEST(ProfilePaths, CumulativeTimeContainsChildrenEvenThroughRecursion) {
259
259
  EXPECT_GT(multiEntry, 0u) << "fixture never produced a multi-entry node";
260
260
  }
261
261
 
262
+ // A call site reached by exactly one path must show the same total in both
263
+ // views.
264
+ //
265
+ // The two are computed differently -- the flat view measures elapsed time
266
+ // across a site's entries, the tree derives cumulative bottom-up from what
267
+ // is actually beneath each node -- so they agree only if the tree really
268
+ // contains the work. Folding a re-entered site onto a DISTANT ancestor
269
+ // broke that: the subtree's time was credited up there and every node in
270
+ // between lost it. On a BOSL2 attachment chain, restore() read 226ms in the
271
+ // flat view and 2.5ms in the tree for the same call site.
272
+ //
273
+ // Restricted to single-node sites deliberately. A site that nests within
274
+ // itself has a node per level now, and summing those double-counts, while
275
+ // the flat view is recursion-guarded and counts only the outermost -- so
276
+ // the two legitimately differ there and comparing them proves nothing.
277
+ TEST(ProfilePaths, TreeAndFlatAgreeForASiteReachedOneWay) {
278
+ const ProfileResult r = profileSrc(
279
+ // m()'s call site sits inside step(), which inner() re-enters, so
280
+ // the second m() finds an m() already open ABOVE inner() and step().
281
+ // That is the shape that used to fold across, stripping the work
282
+ // below out of both of them. Anything simpler never folds and so
283
+ // passes either way -- the first fixture written here did exactly
284
+ // that and proved nothing.
285
+ "function work(n) = n <= 0 ? 0 : work(n - 1) + len([for (i = [0:400]) i]);\n"
286
+ "module leaf() { x = work(10); cube(1); }\n"
287
+ "module m() { children(); }\n"
288
+ "module step(n) { m() inner(n); }\n"
289
+ "module inner(n) { if (n > 0) step(n - 1); else leaf(); }\n"
290
+ "step(2);\n");
291
+ ASSERT_FALSE(r.paths.empty());
292
+
293
+ size_t checked = 0;
294
+ for (const auto& site : r.callSites) {
295
+ double treeTotal = 0.0;
296
+ size_t nodes = 0;
297
+ for (const auto& n : r.paths) {
298
+ if (n.name == site.name && n.kind == site.kind
299
+ && n.callOrigin == site.callOrigin && n.callLine == site.callLine
300
+ && n.callColumn == site.callColumn) {
301
+ treeTotal += n.cumulativeTime;
302
+ ++nodes;
303
+ }
304
+ }
305
+ if (nodes != 1) continue;
306
+ ++checked;
307
+ EXPECT_NEAR(treeTotal, site.cumulativeTime, 1e-6)
308
+ << site.kind << " " << site.name << " at line " << site.callLine
309
+ << ":" << site.callColumn << " -- flat " << site.cumulativeTime
310
+ << " vs tree " << treeTotal;
311
+ }
312
+ EXPECT_GT(checked, 2u) << "fixture produced too few single-path sites to mean anything";
313
+ }
314
+
315
+ // Direct self-recursion still folds: the whole point of folding is that
316
+ // `f` calling `f` 400 deep is not 400 nodes.
317
+ TEST(ProfilePaths, DirectSelfRecursionStillFolds) {
318
+ const ProfileResult r = profileSrc(
319
+ "function down(n) = n <= 0 ? 0 : down(n - 1) + 1;\n"
320
+ "x = down(20);\n"
321
+ "cube(x >= 0 ? 1 : 2);\n");
322
+ size_t downNodes = 0;
323
+ for (const auto& n : r.paths) if (n.name == "down") ++downNodes;
324
+ EXPECT_LE(downNodes, 2u) << downNodes;
325
+ }
326
+
262
327
  // The root accounts for essentially the whole resolve pass -- the gap is
263
328
  // top-level work outside any user call, which is what unattributedTime is.
264
329
  TEST(ProfilePaths, RootCoversTheProfiledWork) {