openscad-cpp-evaluator 1.20.0__tar.gz → 1.20.2__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 (222) hide show
  1. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/pyproject.toml +1 -1
  3. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/user_calls.cpp +8 -0
  4. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/value.cpp +18 -22
  5. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_coverage.cpp +27 -0
  6. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_value.cpp +13 -8
  7. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/.github/workflows/ci.yml +0 -0
  8. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/.github/workflows/wheels.yml +0 -0
  9. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/.gitignore +0 -0
  10. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/.gitmodules +0 -0
  11. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/CLAUDE.md +0 -0
  12. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/CMakeLists.txt +0 -0
  13. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/LICENSE +0 -0
  14. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/README.md +0 -0
  15. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/bindings/CMakeLists.txt +0 -0
  16. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/bindings/ast_to_py.cpp +0 -0
  17. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/bindings/module.cpp +0 -0
  18. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/cmake/embed_font.cmake +0 -0
  19. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/examples/CMakeLists.txt +0 -0
  20. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/examples/eval_perf_benchmark.cpp +0 -0
  21. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/examples/manifold_cache_reuse.cpp +0 -0
  22. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/examples/minimal_debugger.cpp +0 -0
  23. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  24. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/.gitignore +0 -0
  25. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  26. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  27. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/README.md +0 -0
  28. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  29. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  30. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  31. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  32. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  33. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  34. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  35. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  36. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  37. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  38. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  39. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  40. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  41. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
  42. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  43. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  44. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  45. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/api.cpp +0 -0
  46. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  47. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  48. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  49. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  50. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  51. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  52. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  53. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  54. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  55. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  56. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  57. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  58. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  59. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  60. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  61. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  62. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/position.cpp +0 -0
  63. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  64. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  65. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  66. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  67. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  68. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  69. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  70. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  71. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  72. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  73. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  74. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  75. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  76. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  77. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  78. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  79. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  80. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  81. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  82. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  83. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  84. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  85. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  86. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  87. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
  88. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  89. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  90. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  91. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  92. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  93. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  94. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  95. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  96. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  97. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  98. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
  99. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  100. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  101. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  102. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  103. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  104. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  105. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  106. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  107. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  108. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  109. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/export.hpp +0 -0
  110. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  111. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  112. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
  113. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  114. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  115. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  116. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  117. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  118. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  119. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  120. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  121. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  122. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  123. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  124. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  125. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
  126. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/value.hpp +0 -0
  127. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  128. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/python/openscad_cpp_evaluator/__init__.py +0 -0
  129. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/resources/fonts/LICENSE +0 -0
  130. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/resources/fonts/LiberationSans-Bold.ttf +0 -0
  131. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
  132. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/resources/fonts/LiberationSans-Italic.ttf +0 -0
  133. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  134. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/.DS_Store +0 -0
  135. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/CMakeLists.txt +0 -0
  136. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/booleans.cpp +0 -0
  137. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/builtins.hpp +0 -0
  138. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/call_args.cpp +0 -0
  139. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/color.cpp +0 -0
  140. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/control.cpp +0 -0
  141. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/dxf_dim.cpp +0 -0
  142. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/extrude.cpp +0 -0
  143. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/function_builtins.cpp +0 -0
  144. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/import.cpp +0 -0
  145. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/modifiers.cpp +0 -0
  146. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/primitives_2d.cpp +0 -0
  147. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/primitives_3d.cpp +0 -0
  148. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/registry.cpp +0 -0
  149. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/roof.cpp +0 -0
  150. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/segments.cpp +0 -0
  151. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/surface.cpp +0 -0
  152. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/text.cpp +0 -0
  153. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/topology.cpp +0 -0
  154. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/builtins/transforms.cpp +0 -0
  155. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/bytecode_compiler.cpp +0 -0
  156. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/bytecode_vm.cpp +0 -0
  157. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/colored_body.cpp +0 -0
  158. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/coverage.cpp +0 -0
  159. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/csg_generate.cpp +0 -0
  160. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/csg_resolve.cpp +0 -0
  161. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/css_colors.cpp +0 -0
  162. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/debug/debug_repl.cpp +0 -0
  163. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/debug_profile.cpp +0 -0
  164. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/eval_context.cpp +0 -0
  165. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/eval_error.cpp +0 -0
  166. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/eval_use.cpp +0 -0
  167. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/export.cpp +0 -0
  168. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/expr_eval.cpp +0 -0
  169. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/format_closure.cpp +0 -0
  170. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/import/dxf_import.cpp +0 -0
  171. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/import/mesh_import.cpp +0 -0
  172. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/import/surface_load.cpp +0 -0
  173. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/import/svg_import.cpp +0 -0
  174. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/manifold_cache.cpp +0 -0
  175. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/measure_geometry.cpp +0 -0
  176. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/mesh_check.cpp +0 -0
  177. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/stmt_eval.cpp +0 -0
  178. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/text/font_match.cpp +0 -0
  179. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/text/freetype_font_provider.cpp +0 -0
  180. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/text/text_metrics.cpp +0 -0
  181. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/utf8.cpp +0 -0
  182. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/src/zip_stored.cpp +0 -0
  183. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/CMakeLists.txt +0 -0
  184. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_booleans.cpp +0 -0
  185. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_bytecode_compiler.cpp +0 -0
  186. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_children_separate.cpp +0 -0
  187. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_cli.cpp +0 -0
  188. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_control_flow.cpp +0 -0
  189. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_csg_tree.cpp +0 -0
  190. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_debug_hooks.cpp +0 -0
  191. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_dxf_svg_import.cpp +0 -0
  192. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_eval_context.cpp +0 -0
  193. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_export.cpp +0 -0
  194. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_expr_eval.cpp +0 -0
  195. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_extrude_roof.cpp +0 -0
  196. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_feature_detection.cpp +0 -0
  197. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_function_builtins.cpp +0 -0
  198. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_helpers.hpp +0 -0
  199. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_import_export.cpp +0 -0
  200. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_include_cache.cpp +0 -0
  201. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_manifold_cache.cpp +0 -0
  202. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_mesh_check.cpp +0 -0
  203. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_multi_color_merge.cpp +0 -0
  204. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_primitives.cpp +0 -0
  205. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_profiling.cpp +0 -0
  206. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_python_bindings.py +0 -0
  207. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_render_expr.cpp +0 -0
  208. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_scope_trail.cpp +0 -0
  209. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_scoping.cpp +0 -0
  210. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_surface.cpp +0 -0
  211. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_tail_calls.cpp +0 -0
  212. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_text.cpp +0 -0
  213. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_transforms.cpp +0 -0
  214. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_unexpected_args.cpp +0 -0
  215. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_use.cpp +0 -0
  216. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_viewport_params.cpp +0 -0
  217. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tests/test_zip_stored.cpp +0 -0
  218. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tools/cli/CMakeLists.txt +0 -0
  219. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tools/cli/cli_lib.cpp +0 -0
  220. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tools/cli/cli_lib.hpp +0 -0
  221. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/tools/cli/main.cpp +0 -0
  222. {openscad_cpp_evaluator-1.20.0 → openscad_cpp_evaluator-1.20.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.20.0
3
+ Version: 1.20.2
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 = "1.20.0"
7
+ version = "1.20.2"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -691,6 +691,14 @@ void Evaluator::recordTailCallHop(const std::string& calleeName, const oscad::AS
691
691
  // and never see the NEW one at all.
692
692
  noteActiveDeclExit(frame.declNode);
693
693
  noteActiveDeclEnter(&calleeDecl);
694
+ // Body coverage: this declaration was entered, exactly as in
695
+ // enterUserCall. A hop is the ONLY way into a tail-called body, so
696
+ // without this a function reached only in tail position reports its
697
+ // body as never run while its own branch arms report hits -- which
698
+ // reads as "the condition was not covered but the branches were".
699
+ // BOSL2's _str_split_recurse is the shape that shows it: recursion
700
+ // through a ternary arm is a tail call every time.
701
+ coverHit(calleeDecl);
694
702
  frame.name = calleeName;
695
703
  frame.declNode = &calleeDecl;
696
704
  frame.declPosition = &calleeDecl.position();
@@ -410,24 +410,28 @@ std::string encodeEscapedCodePoint(std::uint32_t cp) {
410
410
  std::string unescapeStringLiteral(const std::string& raw) {
411
411
  // Most strings need no work at all, and this runs on every evaluation
412
412
  // of a literal on the tree-walking path -- so don't build a second copy
413
- // unless there is something to change. A bare newline counts as
414
- // something to change (see the loop), so it has to open the scan too.
415
- const size_t first = raw.find_first_of("\\\n");
413
+ // unless there is something to change. A bare line ending counts as
414
+ // something to change (see the loop), so CR and LF open the scan too.
415
+ const size_t first = raw.find_first_of("\\\n\r");
416
416
  if (first == std::string::npos) return raw;
417
417
 
418
418
  std::string out;
419
419
  out.reserve(raw.size());
420
420
  out.append(raw, 0, first);
421
421
  for (size_t i = first; i < raw.size(); ++i) {
422
- // A raw LF inside a string literal contributes NOTHING -- writing a
423
- // string across two source lines joins them, keeping the second
424
- // line's indentation:
422
+ // A raw line ending inside a string literal contributes NOTHING --
423
+ // writing a string across two source lines joins them, keeping the
424
+ // second line's indentation:
425
425
  // s = "abcd
426
426
  // efgh"; // -> "abcd efgh", 12 characters
427
- // A raw CR is not special and stands for itself, so a CRLF file
428
- // leaves the CR behind (len 3 for "x<CR><LF>y"). Both verified on
429
- // 2026.02.01.
430
- if (raw[i] == '\n') continue;
427
+ // CR counts as a line ending too, which the reference does not do:
428
+ // it drops only the LF, so every string wrapped in a file written
429
+ // on Windows keeps a stray CR (len 3 for "x<CR><LF>y" there, 2
430
+ // here). A raw CR in source is a line ending in every real file --
431
+ // CRLF on Windows, a lone CR on a pre-OSX Mac -- and a string that
432
+ // wants a real CR in it writes \r. Same reasoning as the backslash
433
+ // continuation below.
434
+ if (raw[i] == '\n' || raw[i] == '\r') continue;
431
435
  if (raw[i] != '\\' || i + 1 >= raw.size()) {
432
436
  out.push_back(raw[i]); // a trailing lone backslash stands for itself
433
437
  continue;
@@ -467,18 +471,10 @@ std::string unescapeStringLiteral(const std::string& raw) {
467
471
  ++i;
468
472
  break;
469
473
  }
470
- case '\n': ++i; break; // backslash + LF: both go
471
- case '\r':
472
- // A backslash before CRLF takes the whole line ending.
473
- // Deliberately unlike the reference, which treats the
474
- // backslash as an undefined escape and keeps the CR --
475
- // leaving a stray control character in any string wrapped
476
- // in a file written on Windows. See this suite's
477
- // BackslashNewlineContributesNothing.
478
- if (i + 2 < raw.size() && raw[i + 2] == '\n') { i += 2; break; }
479
- out.push_back('\r');
480
- ++i;
481
- break;
474
+ // A backslash before a line ending takes the whole thing; any
475
+ // LF after a CR is dropped by the loop itself.
476
+ case '\n':
477
+ case '\r': ++i; break;
482
478
  default: out.push_back(next); ++i; break; // \\ and \" land here too
483
479
  }
484
480
  }
@@ -168,6 +168,33 @@ TEST(Coverage, VmAndInterpreterAgree) {
168
168
  }
169
169
  }
170
170
 
171
+ // A tail call hops the frame instead of pushing one, so it never reaches
172
+ // enterUserCall -- where the body hit is recorded. A function reached ONLY
173
+ // in tail position therefore reported its body as never run while its own
174
+ // ternary arms reported hits, which reads on screen as "the condition is
175
+ // uncovered but both branches are covered". BOSL2's _str_split_recurse is
176
+ // the shape that shows it: recursion through a ternary arm is a tail call
177
+ // every time.
178
+ TEST(Coverage, TailCalledBodyIsCounted) {
179
+ const std::string code =
180
+ "function inner(i) = i == 0 ? \"done\" : inner(i-1);\n"
181
+ "function tail_caller(i) = inner(i);\n"
182
+ "echo(tail_caller(2));\n";
183
+ for (bool useVm : {true, false}) {
184
+ ScopedVm vm(useVm);
185
+ const CoverageResult r = cover(code);
186
+ std::uint32_t innerBody = 0, arms = 0;
187
+ for (const CoverageSpan& s : r.spans) {
188
+ if (s.kind == CoverageKind::Body && s.line == 1) innerBody = s.hits;
189
+ if (s.kind == CoverageKind::Branch && s.line == 1) arms += s.hits;
190
+ }
191
+ EXPECT_GT(innerBody, 0u) << (useVm ? "VM" : "interpreter")
192
+ << ": a body reached only by tail calls still ran";
193
+ EXPECT_EQ(innerBody, arms) << (useVm ? "VM" : "interpreter")
194
+ << ": every entry takes exactly one arm";
195
+ }
196
+ }
197
+
171
198
  TEST(Coverage, PerFilePercentages) {
172
199
  const CoverageResult r = cover(
173
200
  "function f(x) = x > 0 ? 1 : 2;\n" // body hit; arms: 1 of 2
@@ -470,8 +470,8 @@ TEST(StringEscapes, BackslashNewlineContributesNothing) {
470
470
  // Deliberately unlike the reference implementation, which drops only
471
471
  // the LF and leaves the CR in the value -- a stray control character
472
472
  // in any string continued in a file written on Windows.
473
- EXPECT_EQ(unescapeStringLiteral("a \\\rb"), "a \rb")
474
- << "a lone CR is an ordinary escaped character, not a line ending";
473
+ EXPECT_EQ(unescapeStringLiteral("a \\\rb"), "a b")
474
+ << "a lone CR is a line ending too (pre-OSX Mac)";
475
475
  }
476
476
 
477
477
  // Both evaluation paths build the Value, and only one of them was reached
@@ -583,11 +583,16 @@ TEST(StringEscapes, ARawNewlineInsideALiteralContributesNothing) {
583
583
  EXPECT_EQ(unescapeStringLiteral("x\n \n y"), "x y");
584
584
  }
585
585
 
586
- TEST(StringEscapes, ARawCarriageReturnStandsForItself) {
587
- // Only the LF is special. A CRLF file therefore leaves the CR in the
588
- // string: "x<CR><LF>y" is three characters, not two.
589
- EXPECT_EQ(unescapeStringLiteral("x\ry"), "x\ry");
590
- EXPECT_EQ(unescapeStringLiteral("x\r\ny"), "x\ry");
586
+ TEST(StringEscapes, ARawCarriageReturnIsALineEndingToo) {
587
+ // The reference treats only the LF as special, so a string wrapped in
588
+ // a CRLF file keeps a stray CR there ("x<CR><LF>y" is three characters
589
+ // on 2026.02.01). Deliberately not reproduced: a raw CR in source is a
590
+ // line ending in every real file -- CRLF on Windows, a lone CR on a
591
+ // pre-OSX Mac -- and a script wanting a real CR writes \r.
592
+ EXPECT_EQ(unescapeStringLiteral("x\r\ny"), "xy");
593
+ EXPECT_EQ(unescapeStringLiteral("x\ry"), "xy");
594
+ EXPECT_EQ(unescapeStringLiteral("x\r\n y"), "x y") << "indentation is kept";
595
+ EXPECT_EQ(unescapeStringLiteral("x\\ry"), "x\ry") << "an escaped CR still works";
591
596
  }
592
597
 
593
598
  TEST(StringEscapes, ABackslashBeforeANewlineTakesTheWholeLineEnding) {
@@ -600,5 +605,5 @@ TEST(StringEscapes, ABackslashBeforeANewlineTakesTheWholeLineEnding) {
600
605
  // BackslashNewlineContributesNothing above.
601
606
  EXPECT_EQ(unescapeStringLiteral("x\\\ny"), "xy");
602
607
  EXPECT_EQ(unescapeStringLiteral("x\\\r\ny"), "xy"); // reference keeps the CR
603
- EXPECT_EQ(unescapeStringLiteral("x\\\ry"), "x\ry");
608
+ EXPECT_EQ(unescapeStringLiteral("x\\\ry"), "xy");
604
609
  }