openscad-cpp-evaluator 1.20.1__tar.gz → 1.20.3__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.1 → openscad_cpp_evaluator-1.20.3}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/pyproject.toml +1 -1
  3. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/text.cpp +10 -0
  4. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/user_calls.cpp +8 -0
  5. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_coverage.cpp +27 -0
  6. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_manifold_cache.cpp +22 -0
  7. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_text.cpp +27 -0
  8. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/.github/workflows/ci.yml +0 -0
  9. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/.github/workflows/wheels.yml +0 -0
  10. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/.gitignore +0 -0
  11. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/.gitmodules +0 -0
  12. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/CLAUDE.md +0 -0
  13. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/CMakeLists.txt +0 -0
  14. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/LICENSE +0 -0
  15. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/README.md +0 -0
  16. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/bindings/CMakeLists.txt +0 -0
  17. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/bindings/ast_to_py.cpp +0 -0
  18. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/bindings/module.cpp +0 -0
  19. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/cmake/embed_font.cmake +0 -0
  20. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/examples/CMakeLists.txt +0 -0
  21. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/examples/eval_perf_benchmark.cpp +0 -0
  22. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/examples/manifold_cache_reuse.cpp +0 -0
  23. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/examples/minimal_debugger.cpp +0 -0
  24. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  25. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/.gitignore +0 -0
  26. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  27. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  28. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/README.md +0 -0
  29. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  30. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  31. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  32. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  33. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  34. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  35. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  36. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  37. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  38. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  39. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  40. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  41. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  42. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
  43. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  44. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  45. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  46. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/api.cpp +0 -0
  47. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  48. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  49. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  50. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  51. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  52. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  53. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  54. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  55. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  56. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  57. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  58. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  59. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  60. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  61. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  62. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  63. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/position.cpp +0 -0
  64. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  65. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  66. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  67. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  68. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  69. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  70. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  71. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  72. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  73. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  74. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  75. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  76. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  77. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  78. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  79. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  80. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  81. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  82. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  83. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  84. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  85. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  86. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  87. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  88. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
  89. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  90. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  91. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  92. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  93. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  94. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  95. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  96. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  97. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  98. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  99. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
  100. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  101. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  102. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  103. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  104. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  105. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  106. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  107. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  108. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  109. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  110. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/export.hpp +0 -0
  111. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  112. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  113. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
  114. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  115. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  116. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  117. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  118. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  119. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  120. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  121. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  122. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  123. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  124. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  125. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  126. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
  127. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/value.hpp +0 -0
  128. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  129. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/python/openscad_cpp_evaluator/__init__.py +0 -0
  130. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/resources/fonts/LICENSE +0 -0
  131. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/resources/fonts/LiberationSans-Bold.ttf +0 -0
  132. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
  133. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/resources/fonts/LiberationSans-Italic.ttf +0 -0
  134. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  135. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/.DS_Store +0 -0
  136. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/CMakeLists.txt +0 -0
  137. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/booleans.cpp +0 -0
  138. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/builtins.hpp +0 -0
  139. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/call_args.cpp +0 -0
  140. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/color.cpp +0 -0
  141. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/control.cpp +0 -0
  142. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/dxf_dim.cpp +0 -0
  143. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/extrude.cpp +0 -0
  144. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/function_builtins.cpp +0 -0
  145. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/import.cpp +0 -0
  146. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/modifiers.cpp +0 -0
  147. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/primitives_2d.cpp +0 -0
  148. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/primitives_3d.cpp +0 -0
  149. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/registry.cpp +0 -0
  150. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/roof.cpp +0 -0
  151. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/segments.cpp +0 -0
  152. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/surface.cpp +0 -0
  153. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/topology.cpp +0 -0
  154. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/builtins/transforms.cpp +0 -0
  155. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/bytecode_compiler.cpp +0 -0
  156. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/bytecode_vm.cpp +0 -0
  157. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/colored_body.cpp +0 -0
  158. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/coverage.cpp +0 -0
  159. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/csg_generate.cpp +0 -0
  160. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/csg_resolve.cpp +0 -0
  161. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/css_colors.cpp +0 -0
  162. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/debug/debug_repl.cpp +0 -0
  163. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/debug_profile.cpp +0 -0
  164. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/eval_context.cpp +0 -0
  165. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/eval_error.cpp +0 -0
  166. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/eval_use.cpp +0 -0
  167. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/export.cpp +0 -0
  168. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/expr_eval.cpp +0 -0
  169. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/format_closure.cpp +0 -0
  170. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/import/dxf_import.cpp +0 -0
  171. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/import/mesh_import.cpp +0 -0
  172. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/import/surface_load.cpp +0 -0
  173. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/import/svg_import.cpp +0 -0
  174. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/manifold_cache.cpp +0 -0
  175. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/measure_geometry.cpp +0 -0
  176. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/mesh_check.cpp +0 -0
  177. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/stmt_eval.cpp +0 -0
  178. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/text/font_match.cpp +0 -0
  179. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/text/freetype_font_provider.cpp +0 -0
  180. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/text/text_metrics.cpp +0 -0
  181. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/utf8.cpp +0 -0
  182. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/value.cpp +0 -0
  183. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/src/zip_stored.cpp +0 -0
  184. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/CMakeLists.txt +0 -0
  185. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_booleans.cpp +0 -0
  186. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_bytecode_compiler.cpp +0 -0
  187. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_children_separate.cpp +0 -0
  188. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_cli.cpp +0 -0
  189. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_control_flow.cpp +0 -0
  190. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_csg_tree.cpp +0 -0
  191. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_debug_hooks.cpp +0 -0
  192. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_dxf_svg_import.cpp +0 -0
  193. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_eval_context.cpp +0 -0
  194. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_export.cpp +0 -0
  195. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_expr_eval.cpp +0 -0
  196. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_extrude_roof.cpp +0 -0
  197. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_feature_detection.cpp +0 -0
  198. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_function_builtins.cpp +0 -0
  199. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_helpers.hpp +0 -0
  200. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_import_export.cpp +0 -0
  201. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_include_cache.cpp +0 -0
  202. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_mesh_check.cpp +0 -0
  203. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_multi_color_merge.cpp +0 -0
  204. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_primitives.cpp +0 -0
  205. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_profiling.cpp +0 -0
  206. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_python_bindings.py +0 -0
  207. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_render_expr.cpp +0 -0
  208. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_scope_trail.cpp +0 -0
  209. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_scoping.cpp +0 -0
  210. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_surface.cpp +0 -0
  211. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_tail_calls.cpp +0 -0
  212. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_transforms.cpp +0 -0
  213. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_unexpected_args.cpp +0 -0
  214. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_use.cpp +0 -0
  215. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_value.cpp +0 -0
  216. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_viewport_params.cpp +0 -0
  217. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tests/test_zip_stored.cpp +0 -0
  218. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tools/cli/CMakeLists.txt +0 -0
  219. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tools/cli/cli_lib.cpp +0 -0
  220. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tools/cli/cli_lib.hpp +0 -0
  221. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/tools/cli/main.cpp +0 -0
  222. {openscad_cpp_evaluator-1.20.1 → openscad_cpp_evaluator-1.20.3}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.20.1
3
+ Version: 1.20.3
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.1"
7
+ version = "1.20.3"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -70,6 +70,16 @@ CSGParams resolveText(Evaluator& ev, const oscad::ModularCall& node, EvalContext
70
70
  }
71
71
 
72
72
  CSGParams params;
73
+ // The handle is what generateText looks the face up by, but it is an
74
+ // index into THIS evaluator's FontProvider -- the first font resolved
75
+ // is handle 0 whatever it is. Two evaluators sharing a ManifoldCache
76
+ // (two tabs in a GUI, say) therefore agreed on "font_handle=0" for
77
+ // entirely different fonts, and the second render was served the
78
+ // first one's glyphs. The spec goes in the params too, so the cache
79
+ // key tells them apart: the same spec always resolves to the same
80
+ // face, and two specs that happen to resolve alike merely miss the
81
+ // cache rather than collide.
82
+ params["font_spec"] = Value{fontSpec};
73
83
  params["font_handle"] = Value{static_cast<double>(handle)};
74
84
  params["scale"] = Value{scale};
75
85
  params["segs"] = Value{static_cast<double>(segs)};
@@ -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();
@@ -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
@@ -36,6 +36,28 @@ TEST(ManifoldCacheKey, BoolAndNumberParamsProduceDifferentCacheKeys) {
36
36
  EXPECT_NE(cacheKey(a), cacheKey(b));
37
37
  }
38
38
 
39
+ TEST(ManifoldCacheKey, TwoFontsWithTheSameHandleDoNotShareAKey) {
40
+ // A FontHandle indexes the EVALUATOR's own FontProvider, so the first
41
+ // font any evaluator resolves is handle 0 whatever it is. Two
42
+ // evaluators sharing one ManifoldCache -- two tabs in a GUI -- agreed
43
+ // on "font_handle=0" for entirely different fonts, and the second was
44
+ // served the first one's glyphs. text() puts the SPEC in the params
45
+ // too, so the key tells them apart.
46
+ CSGNode a;
47
+ a.kind = "text";
48
+ a.isBuiltin = true;
49
+ a.params["font_handle"] = Value{0.0};
50
+ a.params["font_spec"] = Value{std::string("Arial:style=Regular")};
51
+
52
+ CSGNode b;
53
+ b.kind = "text";
54
+ b.isBuiltin = true;
55
+ b.params["font_handle"] = Value{0.0}; // same handle, different font
56
+ b.params["font_spec"] = Value{std::string("Arial:style=Bold")};
57
+
58
+ EXPECT_NE(cacheKey(a), cacheKey(b));
59
+ }
60
+
39
61
  TEST(ManifoldCacheKey, IdenticalStructureProducesIdenticalKeyRegardlessOfParamInsertionOrder) {
40
62
  CSGNode a;
41
63
  a.kind = "cube";
@@ -422,3 +422,30 @@ TEST(TextArgs, FontIsPositionalButTheRestAreNot) {
422
422
  // NOTHING, and halign by name does move it.
423
423
  EXPECT_EQ(echoes[0], "ECHO: true, false, true, false");
424
424
  }
425
+
426
+ namespace oscadeval {
427
+
428
+ // Why text() must put the font SPEC in its CSG params and not just the
429
+ // handle: a handle numbers faces WITHIN one provider, and every Evaluator
430
+ // makes its own. Two evaluators sharing a ManifoldCache -- two GUI tabs --
431
+ // hand the cache the same number for different fonts (BelfrySCAD#434).
432
+ TEST(FontHandles, AreOnlyMeaningfulWithinOneProvider) {
433
+ FreetypeFontProvider a, b;
434
+ const FontHandle aReg = a.resolveFont("Arial:style=Regular");
435
+ const FontHandle aBold = a.resolveFont("Arial:style=Bold");
436
+ if (aReg == aBold) {
437
+ GTEST_SKIP() << "this machine resolves both specs to one face";
438
+ }
439
+ EXPECT_NE(aReg, aBold) << "within one provider, two fonts get two handles";
440
+ // What a second provider numbers them is NOT asserted: it depends on
441
+ // which faces that machine has and the order they are opened in. On
442
+ // macOS a fresh provider resolving Bold first returns 4 -- the same
443
+ // number the first provider gave REGULAR, which is the collision this
444
+ // whole change is about. On a Linux runner with only the bundled faces
445
+ // the numbering happens to line up instead (0 and 1 either way). That
446
+ // it CAN collide is the point, and it is not a property to pin to a
447
+ // number here; the end-to-end regression test lives in BelfrySCAD,
448
+ // where the collision reproduces in both directions.
449
+ }
450
+
451
+ } // namespace oscadeval