openscad-cpp-evaluator 0.44.0__tar.gz → 0.45.1__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 (208) hide show
  1. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/bindings/module.cpp +30 -11
  3. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/python/openscad_cpp_evaluator/__init__.py +11 -0
  5. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/function_builtins.cpp +2 -0
  6. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/bytecode_compiler.cpp +4 -1
  7. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/bytecode_vm.cpp +2 -0
  8. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/expr_eval.cpp +13 -1
  9. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_expr_eval.cpp +24 -11
  10. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_feature_detection.cpp +3 -2
  11. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/.github/workflows/ci.yml +0 -0
  12. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/.github/workflows/wheels.yml +0 -0
  13. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/.gitignore +0 -0
  14. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/.gitmodules +0 -0
  15. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/CLAUDE.md +0 -0
  16. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/CMakeLists.txt +0 -0
  17. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/LICENSE +0 -0
  18. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/README.md +0 -0
  19. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/bindings/CMakeLists.txt +0 -0
  20. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/bindings/ast_to_py.cpp +0 -0
  21. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/cmake/embed_font.cmake +0 -0
  22. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/examples/CMakeLists.txt +0 -0
  23. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/examples/eval_perf_benchmark.cpp +0 -0
  24. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/examples/manifold_cache_reuse.cpp +0 -0
  25. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/examples/minimal_debugger.cpp +0 -0
  26. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  27. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/.gitignore +0 -0
  28. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  29. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  30. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/README.md +0 -0
  31. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  32. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  33. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  34. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  35. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  36. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  37. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  38. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  39. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  40. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  41. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  42. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  43. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  44. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  45. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  46. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  47. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/api.cpp +0 -0
  48. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  49. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  50. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  51. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  52. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  53. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  54. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  55. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  56. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  57. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  58. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  59. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  60. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  61. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  62. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  63. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  64. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/position.cpp +0 -0
  65. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  66. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  67. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  68. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  69. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  70. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  71. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  72. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  73. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  74. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  75. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  76. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  77. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  78. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  79. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  80. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  81. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  82. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  83. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  84. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  85. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  86. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  87. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  88. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  89. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  90. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  91. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  92. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  93. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  94. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  95. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  96. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  97. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  98. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  99. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  100. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  101. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  102. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  103. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  104. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  105. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  106. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  107. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  108. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  109. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/export.hpp +0 -0
  110. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  111. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  112. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  113. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  114. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  115. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  116. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  117. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  118. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  119. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  120. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  121. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  122. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  123. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  124. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/value.hpp +0 -0
  125. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  126. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/resources/fonts/LICENSE +0 -0
  127. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  128. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/CMakeLists.txt +0 -0
  129. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/booleans.cpp +0 -0
  130. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/builtins.hpp +0 -0
  131. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/call_args.cpp +0 -0
  132. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/color.cpp +0 -0
  133. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/control.cpp +0 -0
  134. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/dxf_dim.cpp +0 -0
  135. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/extrude.cpp +0 -0
  136. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/import.cpp +0 -0
  137. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/modifiers.cpp +0 -0
  138. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/primitives_2d.cpp +0 -0
  139. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/primitives_3d.cpp +0 -0
  140. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/registry.cpp +0 -0
  141. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/roof.cpp +0 -0
  142. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/segments.cpp +0 -0
  143. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/surface.cpp +0 -0
  144. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/text.cpp +0 -0
  145. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/topology.cpp +0 -0
  146. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/builtins/transforms.cpp +0 -0
  147. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/colored_body.cpp +0 -0
  148. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/csg_generate.cpp +0 -0
  149. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/csg_resolve.cpp +0 -0
  150. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/css_colors.cpp +0 -0
  151. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/debug/debug_repl.cpp +0 -0
  152. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/debug_profile.cpp +0 -0
  153. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/eval_context.cpp +0 -0
  154. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/eval_error.cpp +0 -0
  155. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/eval_use.cpp +0 -0
  156. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/export.cpp +0 -0
  157. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/import/dxf_import.cpp +0 -0
  158. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/import/mesh_import.cpp +0 -0
  159. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/import/surface_load.cpp +0 -0
  160. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/import/svg_import.cpp +0 -0
  161. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/manifold_cache.cpp +0 -0
  162. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/measure_geometry.cpp +0 -0
  163. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/mesh_check.cpp +0 -0
  164. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/stmt_eval.cpp +0 -0
  165. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/text/font_match.cpp +0 -0
  166. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/text/freetype_font_provider.cpp +0 -0
  167. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/text/text_metrics.cpp +0 -0
  168. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/user_calls.cpp +0 -0
  169. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/value.cpp +0 -0
  170. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/src/zip_stored.cpp +0 -0
  171. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/CMakeLists.txt +0 -0
  172. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_booleans.cpp +0 -0
  173. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_bytecode_compiler.cpp +0 -0
  174. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_children_separate.cpp +0 -0
  175. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_cli.cpp +0 -0
  176. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_control_flow.cpp +0 -0
  177. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_csg_tree.cpp +0 -0
  178. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_debug_hooks.cpp +0 -0
  179. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_dxf_svg_import.cpp +0 -0
  180. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_eval_context.cpp +0 -0
  181. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_export.cpp +0 -0
  182. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_extrude_roof.cpp +0 -0
  183. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_function_builtins.cpp +0 -0
  184. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_helpers.hpp +0 -0
  185. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_import_export.cpp +0 -0
  186. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_manifold_cache.cpp +0 -0
  187. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_mesh_check.cpp +0 -0
  188. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_multi_color_merge.cpp +0 -0
  189. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_primitives.cpp +0 -0
  190. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_profiling.cpp +0 -0
  191. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_python_bindings.py +0 -0
  192. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_render_expr.cpp +0 -0
  193. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_scope_trail.cpp +0 -0
  194. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_scoping.cpp +0 -0
  195. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_surface.cpp +0 -0
  196. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_tail_calls.cpp +0 -0
  197. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_text.cpp +0 -0
  198. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_transforms.cpp +0 -0
  199. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_unexpected_args.cpp +0 -0
  200. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_use.cpp +0 -0
  201. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_value.cpp +0 -0
  202. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_viewport_params.cpp +0 -0
  203. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tests/test_zip_stored.cpp +0 -0
  204. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tools/cli/CMakeLists.txt +0 -0
  205. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tools/cli/cli_lib.cpp +0 -0
  206. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tools/cli/cli_lib.hpp +0 -0
  207. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/tools/cli/main.cpp +0 -0
  208. {openscad_cpp_evaluator-0.44.0 → openscad_cpp_evaluator-0.45.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.44.0
3
+ Version: 0.45.1
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -385,17 +385,36 @@ nb::object evaluate(const std::string& path, nb::dict viewportParams,
385
385
  {
386
386
  nb::gil_scoped_release rel;
387
387
  auto logFn = [&echoes](const std::string& m) { echoes.push_back(m); };
388
- std::vector<std::unique_ptr<oscad::ASTNode>> ast = oscad::getASTFromFile(path);
389
- oscadeval::ResolvedUseScopes used = oscadeval::resolveUseScopes(ast, path, logFn);
390
- oscadeval::Evaluator ev(logFn, nullptr, manifoldCache, oscadeval::DebugHooks{}, profile);
391
- oscadeval::EvalContext ctx = oscadeval::EvalContext::makeRoot(used.rootScope.get());
392
- bodies = oscadeval::toRenderableBodies(ev.evaluate(used.processedNodes, ctx, vp));
393
- collectIdSpans(ev, idSpans);
394
- csgTree = std::move(ev.csgTree);
395
- profileResult = std::move(ev.profileResult);
396
- {
397
- nb::gil_scoped_acquire g; // building Python objects needs the GIL back
398
- std::tie(dyn, dynExplicit) = dynStateToPy(ctx);
388
+ try {
389
+ std::vector<std::unique_ptr<oscad::ASTNode>> ast = oscad::getASTFromFile(path);
390
+ oscadeval::ResolvedUseScopes used = oscadeval::resolveUseScopes(ast, path, logFn);
391
+ oscadeval::Evaluator ev(logFn, nullptr, manifoldCache, oscadeval::DebugHooks{}, profile);
392
+ oscadeval::EvalContext ctx = oscadeval::EvalContext::makeRoot(used.rootScope.get());
393
+ bodies = oscadeval::toRenderableBodies(ev.evaluate(used.processedNodes, ctx, vp));
394
+ collectIdSpans(ev, idSpans);
395
+ csgTree = std::move(ev.csgTree);
396
+ profileResult = std::move(ev.profileResult);
397
+ {
398
+ nb::gil_scoped_acquire g; // building Python objects needs the GIL back
399
+ std::tie(dyn, dynExplicit) = dynStateToPy(ctx);
400
+ }
401
+ } catch (const std::exception& e) {
402
+ // `echoes` is a local, so letting this unwind past here loses
403
+ // every echo and warning the script produced BEFORE it failed --
404
+ // which is exactly the output you want when something fails. The
405
+ // batching that makes them cheap (no GIL round-trip per line) is
406
+ // also what made them disposable.
407
+ //
408
+ // Carry them out on the exception itself: args = (message,
409
+ // [echo, ...]). The facade replays them through echo_fn and then
410
+ // re-raises. Anything that only looks at str(e) is unaffected,
411
+ // since args[0] is still the formatted diagnostic.
412
+ nb::gil_scoped_acquire g;
413
+ nb::list partial;
414
+ for (const std::string& s : echoes) partial.append(s);
415
+ nb::object args = nb::make_tuple(nb::str(e.what()), partial);
416
+ PyErr_SetObject(PyExc_RuntimeError, args.ptr());
417
+ throw nb::python_error();
399
418
  }
400
419
  }
401
420
 
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.44.0"
7
+ version = "0.45.1"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -504,6 +504,17 @@ class Evaluator:
504
504
  except EvalError:
505
505
  raise
506
506
  except Exception as e: # ParseError/EvalError from C++ arrive as RuntimeError
507
+ # The binding attaches whatever the script echoed before it failed
508
+ # as args[1] (see bindings/module.cpp). Replay it first: a failed
509
+ # run's own output is the most useful thing it produced, and
510
+ # dropping it means the console shows the error with none of the
511
+ # context that led to it.
512
+ args = getattr(e, "args", ())
513
+ if len(args) == 2 and isinstance(args[1], list):
514
+ if self._echo_fn:
515
+ for line in args[1]:
516
+ self._echo_fn(line)
517
+ raise EvalError(str(args[0])) from e
507
518
  raise EvalError(str(e)) from e
508
519
  bodies = bodies_from_dicts(body_dicts)
509
520
  # originalID -> a node with `.position` (start/end offsets) for WYSIWYG
@@ -610,6 +610,8 @@ enum class BuiltinFnId {
610
610
  // Guarding on supported_feature() is how a script says so out loud.
611
611
  const std::unordered_map<std::string, double>& featureLevels() {
612
612
  static const std::unordered_map<std::string, double> levels = {
613
+ {"render-expr", 1.0}, // render() in expression position
614
+ {"polyhedron-vnf", 1.0}, // polyhedron(vnf) / polyhedron(object)
613
615
  {"separate-children", 1.0}, // children(..., separate=true)
614
616
  {"minkowski-diff", 1.0}, // minkowski_difference()
615
617
  {"sphere-styles", 1.0}, // sphere(style=)
@@ -262,7 +262,10 @@ public:
262
262
  void compileIdentifierLoad(const std::string& name, const oscad::Position& pos, std::vector<Instruction>& out,
263
263
  CompileScope& scope, bool warnIfUndef) {
264
264
  if (!name.empty() && name[0] == '$') {
265
- out.push_back({Op::LoadDyn, internName(name), 0, &pos});
265
+ // `b` is the warn flag -- a $-name reached through the
266
+ // is_undef() probe must stay quiet, same as LoadFreeNoWarn does
267
+ // for a plain one.
268
+ out.push_back({Op::LoadDyn, internName(name), warnIfUndef ? 1 : 0, &pos});
266
269
  } else if (auto slot = scope.resolve(name)) {
267
270
  out.push_back({Op::LoadLocal, *slot, 0, &pos});
268
271
  } else if (auto upvalSlot = resolveEnclosing(name)) {
@@ -562,6 +562,8 @@ Value driveVm(Evaluator& ev, size_t floor) {
562
562
  } else if (const Value* v = ctx.dyn->find(name)) {
563
563
  f.stack.push_back(*v);
564
564
  } else {
565
+ // ins.b = warn flag; see compileIdentifierLoad.
566
+ if (ins.b) ev.warn("Ignoring unknown variable '" + name + "'", ins.pos);
565
567
  f.stack.push_back(Value{});
566
568
  }
567
569
  ++f.pc;
@@ -138,7 +138,19 @@ Value Evaluator::evalIdentifier(const std::string& name, const oscad::Position*
138
138
  // $-name anyway (dynamic variables aren't scope-declarable) and
139
139
  // exists only for plain identifiers.
140
140
  const Value* v = ctx.dyn->find(name);
141
- return v ? *v : Value{};
141
+ if (v) return *v;
142
+ // Warns like any other unknown name. This used to return silently
143
+ // for EVERY $-read, on the strength of BOSL2's get_slop() --
144
+ // `is_undef($slop) ? 0 : $slop` with $slop never assigned -- being
145
+ // silent in the reference. It is, but for two narrower reasons: the
146
+ // probe does not warn about its own argument (undefProbeTarget), and
147
+ // the else branch never runs when is_undef() is true. A plain
148
+ // `echo($nope)` DOES warn there, in every context checked --
149
+ // assignment, function body, module body, comparison. Real BOSL2
150
+ // (gears, threading, rounded_prism, diff/attach, path_sweep) emits
151
+ // none of these, because it guards its own $-reads.
152
+ if (warnIfUndef) warn("Ignoring unknown variable '" + name + "'", position);
153
+ return Value{};
142
154
  }
143
155
 
144
156
  if (name == "PI") return Value{std::numbers::pi};
@@ -52,21 +52,34 @@ TEST(ExprEvalIdentifiers, UnknownVariableWarnsAndIsUndef) {
52
52
  EXPECT_NE(lastWarning.find("Ignoring unknown variable 'nope'"), std::string::npos);
53
53
  }
54
54
 
55
- TEST(ExprEvalIdentifiers, UndefinedDollarVariableIsUndefWithNoWarning) {
56
- // Found via BOSL2's constants.scad: `function get_slop() = is_undef($slop)
57
- // ? 0 : $slop;` with $slop never assigned anywhere in the script. Real
58
- // OpenSCAD.app produces no warning at all -- $-prefixed names are a
59
- // separate, always-implicitly-available namespace, never requiring a
60
- // scope declaration the way a bare identifier does. This port's
61
- // bytecode VM (Op::LoadDyn, bytecode_vm.cpp) already got this right by
62
- // construction; the plain interpreter incorrectly fell through to the
63
- // same "Ignoring unknown variable" path a genuinely undeclared bare
64
- // identifier hits.
55
+ TEST(ExprEvalIdentifiers, UndefinedDollarVariableIsUndefAndWarns) {
56
+ // A never-assigned $-name reads as undef and warns, exactly like a
57
+ // never-declared bare identifier.
58
+ //
59
+ // This test used to assert the opposite, on the strength of BOSL2's
60
+ // constants.scad -- `function get_slop() = is_undef($slop) ? 0 : $slop;`
61
+ // with $slop never assigned -- being silent in real OpenSCAD. It is,
62
+ // but not because $-reads are exempt: is_undef() does not warn about the
63
+ // name it probes, and the else branch never runs while is_undef() is
64
+ // true. Measured against the reference, a PLAIN read warns in every
65
+ // context tried -- echo, assignment, function body, module body,
66
+ // comparison -- so the old blanket exemption was over-generalised from
67
+ // one guarded expression.
65
68
  std::string lastWarning;
66
69
  Evaluator ev([&](const std::string& msg) { lastWarning = msg; });
67
70
  Value v = evalSrc("$slop", ev);
68
71
  EXPECT_TRUE(std::holds_alternative<std::monostate>(v));
69
- EXPECT_TRUE(lastWarning.empty());
72
+ EXPECT_NE(lastWarning.find("Ignoring unknown variable '$slop'"), std::string::npos) << lastWarning;
73
+ }
74
+
75
+ TEST(ExprEvalIdentifiers, TheBoslGetSlopIdiomStaysSilent) {
76
+ // The case the old exemption existed for, kept as a test in its own
77
+ // right: it must remain silent through the is_undef() probe alone.
78
+ std::string lastWarning;
79
+ Evaluator ev([&](const std::string& msg) { lastWarning = msg; });
80
+ Value v = evalSrc("is_undef($slop) ? 0 : $slop", ev);
81
+ EXPECT_TRUE(lastWarning.empty()) << lastWarning;
82
+ EXPECT_EQ(std::get<double>(v), 0.0);
70
83
  }
71
84
 
72
85
  TEST(ExprEvalIdentifiers, ResolvesViaScopeFallbackWhenNotEagerlyBound) {
@@ -33,8 +33,9 @@ std::vector<std::string> echoesFrom(const std::string& src) {
33
33
 
34
34
  // Every feature name the docs promise. A typo in either direction -- here or
35
35
  // in featureLevels() -- shows up as a 0.
36
- const char* kFeatures[] = {"separate-children", "minkowski-diff", "sphere-styles", "export-name",
37
- "simplify-op", "expr-import", "object-function", "roof-op"};
36
+ const char* kFeatures[] = {"separate-children", "minkowski-diff", "sphere-styles", "export-name",
37
+ "simplify-op", "expr-import", "object-function", "roof-op",
38
+ "render-expr", "polyhedron-vnf"};
38
39
 
39
40
  } // namespace
40
41